xmlファイルを処理する本番環境で実行されているジョブがあります。xmlファイルは約4kで、サイズは8〜9GBです。
処理後、CSVファイルを出力として取得します。すべてのCSVファイルを取得している単一のファイルにマージするcatコマンドがあります。
Errno :: ENOMEM:メモリを割り当てることができません
on cat
(バッククォート)コマンド。
以下にいくつかの詳細を示します。
- システムメモリ-4GB
- スワップ-2GB
- Ruby:1.9.3p286
ファイルはとを使用して処理されnokogiri
ますsaxbuilder-0.0.8
。
ここには、4,000個のXMLファイルを処理するコードのブロックがあり、出力はCSV(xmlごとに1つ)に保存されます(申し訳ありませんが、会社のポリシーのb'cozで共有することは想定していません)。
以下は、出力ファイルを単一のファイルにマージするコードです
Dir["#{processing_directory}/*.csv"].sort_by {|file| [file.count("/"), file]}.each {|file|
`cat #{file} >> #{final_output_file}`
}
処理中にメモリ消費のスナップショットを作成しました。メモリのほぼすべての部分を消費しますが、失敗することはありません。コマンドで常に失敗しますcat
。
バッククォートでは、十分なメモリを取得できない新しいプロセスをフォークしようとするため、失敗します。
あなたの意見とこれに代わるものを教えてください。