Unix 排序内存不足

Unix 排序内存不足

我正在 Fedora 18 上使用以下命令对包含 200M 行的 25 GB 文件进行排序:

排序-S 10G -T /bigdisk 大文件

由于没有记忆,我的进程被杀死。该过程在死亡之前并没有耗尽我的 RAM(12 GB 可用空间)并且磁盘空间也还可以。

任何有关原因的建议表示赞赏。我确信 sort 可以通过其分区和合并来管理这个问题。

来自 dmesg 的更多信息

[87278.935572] Out of memory: Kill process 1971 (sort) score 258 or sacrifice child
[87278.935574] Killed process 1971 (sort) total-vm:4512168kB, anon-rss:4237040kB, file-rss:584kB 

答案1

不要使用-S 10G,它太多了(并且可能没有按照您的想法进行)。 OOMkiller 启动意味着您的系统正在使用所有内存。

根据使用的算法经过sort它将根据可用内存使用内存:TotalMem/8 和AvailableMem 之间最大数的一半。

例如,如果您有 4 GB 可用内存(8 GB 中),sort则将使用 2 GB RAM。它还应该在 /bigdisk 中创建许多 2 GB 文件,最后对它们进行合并排序。

答案2

从我的评论中做出回答:

/run/shm当我用作/bigdisk存储sort临时文件时,我遇到了同样的问题。/run/shm是 RAM 磁盘,因此当排序需要在磁盘上缓存部分结果时(当内存几乎已满时),内存就会耗尽。内核被杀死sort,因为它是使用最多内存的进程。

使用存储在物理磁盘上的位置而不是 RAM 磁盘解决了这个问题。

答案3

尝试设置vm.overcommit_memory = 1: «...

当此标志为 1 时,内核假装始终有足够的内存,直到实际耗尽为止。

……»

使用交换。

相关内容