我有一个在生产中运行的工作,它处理 xml 文件。xml 文件总计约 4k,大小为 8 到 9 GB。
处理后,我们得到 CSV 文件作为输出。我有一个 cat 命令,它将所有 CSV 文件合并到我得到的单个文件中:
Errno::ENOMEM: 无法分配内存
on cat
(反引号)命令。
以下是一些细节:
- 系统内存 - 4 GB
- 交换 - 2 GB
- 红宝石:1.9.3p286
使用nokogiri
和处理文件saxbuilder-0.0.8
。
在这里,有一个代码块将处理 4,000 个 XML 文件,并且输出保存在 CSV 中(每个 xml 1 个)(对不起,我不打算分享它,因为公司政策)。
下面是将输出文件合并到单个文件的代码
Dir["#{processing_directory}/*.csv"].sort_by {|file| [file.count("/"), file]}.each {|file|
`cat #{file} >> #{final_output_file}`
}
我在处理过程中拍摄了内存消耗快照。它几乎消耗了所有部分内存,但是,它不会失败。cat
它总是在命令上失败。
我想,在反引号时,它会尝试分叉一个没有足够内存的新进程,所以它失败了。
请让我知道您的意见和替代方案。