我遇到了一个问题,即 R 函数(NbCluster)使 R 崩溃,但在使用相同数据的不同运行的不同点。根据 journalctl,崩溃都是因为内存问题。例如:
Sep 04 02:00:56 Q35 kernel: [ 7608] 1000 7608 11071962 10836497 87408640 0 0 rsession
Sep 04 02:00:56 Q35 kernel: Out of memory: Kill process 7608 (rsession) score 655 or sacrifice child
Sep 04 02:00:56 Q35 kernel: Killed process 7608 (rsession) total-vm:44287848kB, anon-rss:43345988kB, file-rss:0kB, shmem-rss:0kB
Sep 04 02:00:56 Q35 kernel: oom_reaper: reaped process 7608 (rsession), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB
我一直在测试我的代码以找出导致内存错误的行,结果发现它会有所不同,即使使用相同的数据也是如此。除了想要解决它之外,我对为什么这是一个间歇性问题感到困惑。如果一个对象太大而无法放入内存,那么在给定相同资源的情况下,每次运行它都会出现问题,对吗?
其他进程使用的内存量在运行之间没有显着差异,而且我总是从一个干净的环境开始。当我查看时,top
我总是有空闲的内存(尽管我很少查看崩溃的确切时刻)。我尝试通过删除不需要的对象和定期垃圾收集来减少内存负载,但这并没有明显的效果。
例如,在运行 NbClust 时,有时在运行时发生崩溃,有时length(eigen(TT)$value)
在调用hclust
. 有时它不会崩溃并以相对优雅的“无法分配向量大小”退出除了关于减少内存负载的任何建议之外,我想知道为什么我有时会耗尽内存但其他时候却没有。
编辑:更改hclust
to 的所有用途后hclust.vector
,我在层次聚类步骤中不再发生崩溃。然而,在不同的地方仍然会发生崩溃(通常在调用 时eigen()
)。如果我能够可靠地预测(在一定的误差范围内)我的代码的每一行将使用多少内存,那就太好了。
现代内存管理远没有你想象的那么确定。
如果您想要更多可重现的结果,请确保摆脱任何垃圾收集、任何并行性(特别是与您的程序并行运行的垃圾收集!)并确保该进程在内存中的限制值远小于您的空闲值系统内存。
内核 OOM 杀手是当内核过度使用内存(您可能想了解这意味着什么)、完全没有交换存储并且无法履行其承诺时的最后手段。
内核可以分配在第一次访问之前不需要存在的内存。因此,OOM 杀手不会在分配时发生,而是在实际使用页面时发生。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句