У меня есть работа, работающая на производстве, которая обрабатывает xml-файлы. xml насчитывает около 4 КБ и имеет общий размер от 8 до 9 ГБ.
После обработки мы получаем CSV-файлы на выходе. У меня есть команда cat, которая объединит все файлы CSV в один файл, который я получаю:
Errno::ENOMEM: Не удается выделить память
по команде cat
(обратная галочка).
Ниже приведены некоторые подробности:
- Системная память — 4 ГБ
- Своп - 2 Гб
- Руби: 1.9.3p286
Файлы обрабатываются с помощью nokogiri
и saxbuilder-0.0.8
.
Здесь есть блок кода, который будет обрабатывать 4000 XML-файлов, а вывод сохраняется в CSV (по 1 на xml) (извините, я не собираюсь делиться им из-за политики компании).
Ниже приведен код, который объединит выходные файлы в один файл.
Dir["#{processing_directory}/*.csv"].sort_by {|file| [file.count("/"), file]}.each {|file|
`cat #{file} >> #{final_output_file}`
}
Я сделал снимки потребления памяти во время обработки. Он потребляет почти всю часть памяти, но не выйдет из строя. Это всегда терпит неудачу в команде cat
.
Я предполагаю, что при обратной кавычке он пытается разветвить новый процесс, которому не хватает памяти, поэтому он терпит неудачу.
Пожалуйста, дайте мне знать ваше мнение и альтернативу этому.
free -m
? - person Intrepidd   schedule 26.02.2013