【发布时间】:2013-02-11 17:28:06
【问题描述】:
我有一个工作在生产中运行,它处理 xml 文件。 xml 文件总计约 4k,大小为 8 到 9 GB。
处理后,我们得到 CSV 文件作为输出。我有一个 cat 命令,它将所有 CSV 文件合并到我得到的单个文件中:
Errno::ENOMEM: 无法分配内存
在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 命令上失败。
我猜,在反引号时,它会尝试派生一个没有获得足够内存的新进程,因此它失败了。
请让我知道您的意见和替代方案。
【问题讨论】:
-
IMO 实际展示你在做什么是有意义的。
-
@DaveNewton 我已经编辑了我的帖子,感谢您的回复
-
您的内存可能非常低,导致这种情况发生,您确定还有足够的内存吗?
free -m的输出是什么? -
@Intrepidd,我同意你的观点,free -m 在处理大约 3,000 个文件后显示几乎没有 150 MB。但是,它会继续处理所有文件,并且只会在 cat 命令上失败。
-
这很正常,你有足够的内存来列出所有文件并生成一个shell,但是运行cat时生成的shell会失败,我会为你写一个解决方案并发布它作为答案
标签: ruby shell out-of-memory fork spawn