Mam zadanie uruchomione przy produkcji, która przetwarza pliki xml. pliki xml liczy około 4k i od wielkości 8 do 9 GB razem.Errno :: ENOMEM: Nie można przydzielić pamięci - cat
Po przetworzeniu otrzymujemy pliki CSV jako dane wyjściowe. Mam polecenia cat który połączy wszystkie pliki CSV do jednego pliku dostaję:
ERRNO :: ENOMEM: Nie można przydzielić pamięci
na komendę cat
(lewy apostrof).
Poniżej przedstawiamy kilka szczegółów:
- System Memory - 4 GB
- Swap - 2 GB
- Ruby: 1.9.3p286
Pliki są przetwarzane przy użyciu nokogiri
i saxbuilder-0.0.8
.
Tutaj znajduje się blok kodu, który przetworzy 4 000 plików XML, a dane wyjściowe zostaną zapisane w pliku CSV (1 na xml) (przepraszam, nie mam zamiaru udostępniać go b'coz zasad firmy).
Poniżej znajduje się kod, który będzie łączyć pliki wyjściowe do jednego pliku
Dir["#{processing_directory}/*.csv"].sort_by {|file| [file.count("/"), file]}.each {|file|
`cat #{file} >> #{final_output_file}`
}
Mam podjętej migawek zużycie pamięci podczas processing.It zużywa prawie wszystkie części pamięci, ale to nie będzie zawieść. Zawsze kończy się niepowodzeniem na komendzie cat
.
Podejrzewam, że na backtick próbuje rozwidlić nowy proces, który nie ma wystarczająco dużo pamięci, więc nie powiedzie się.
Proszę dać mi znać swoją opinię i alternatywę dla tego.
IMO byłoby sensownie pokazać, co robisz. –
@DaveNewton Edytowałem swój wpis, dziękuję za odpowiedź – Atith
Może być bardzo mało pamięci, aby tak się stało, czy na pewno masz wystarczająco dużo pamięci? Jaki jest wynik działania '' free -m''? – Intrepidd