R使用waaay比预期更多的内存

时间:2012-11-11 22:28:39

标签: r

我从一个java程序调用了一个Rscript。该脚本的目的是在ggplot中自动生成一堆图形,并将它们拼接在pdf上。它已经变得有点大,可能有30个图表,每个图表都是从他们自己的脚本中调用的。

输入是一个5-20mb的制表符分隔文件,但R会话有时会达到12gb的ram使用率(在mac 10.68 btw上,但这将在所有平台上运行)。

我已经阅读了有关如何查看对象的内存大小的内容,并且没有任何内容超过25mb,即使它深度复制了每个函数和每个过滤器步骤的所有内容,它也不应该接近这个级别。

我也试过gc()无济于事。如果我做gcinfo(TRUE)然后gc()它告诉我它正在使用像38mb的ram。但是活动监视器上升到12gb,事情可能会因为在高清上进行分页而减慢。

我尝试通过bash脚本调用它,我在其中执行ulimit -v 800000但没有好处。

我还能做什么?

2 个答案:

答案 0 :(得分:1)

在作出作业的过程中,R总会制作临时副本,有时甚至超过一个甚至两个。每个临时分配都需要连续内存以分配对象的完整大小。所以通常的建议是计划_at_least_三次连续的 _memory可用。这意味着您还需要关注有多少其他非R程序竞争系统资源以及了解R如何使用内存。您应该尝试重新启动计算机,仅运行R,然后查看如果你获得成功。

一个20mb的输入文件可能会扩展很多(每个字符串8个字节,也许每个字符元素可能更多),具体取决于文件的结构。如果要绘制大文件中的每个点,pdf文件对象也将占用相当大的空间。

我的经历与评论过的其他人不一样。在进行内存密集型操作之前,我会发出gc()问题。你应该提供代码并用“不好”来描述你的意思。您是否收到错误或观察虚拟内存的使用......或者是什么?

答案 1 :(得分:0)

我很抱歉没有发布更全面的代码说明。输入相当长。但我在这里得到的回答仍然很有帮助。以下是我主要解决问题的方法。

我的列数可变,其中一些异常值非常多。但我不需要极端异常值,所以我只是将它们排除在外并切掉那些额外的列。仅此一项就大大降低了内存使用量。我之前没有看过虚拟内存使用情况,但有时它高达200gb lol。这使它降至2GB。

每个图都是在自己的函数中创建的。所以我重新安排了代码,使得每个图形首先生成,然后打印到pdf,然后是rm(graphname)。

另外,我有很多循环,我在数据框中创建新列。我没有这样做,而是在这些计算中创建了没有附加到数据帧的向量。这实际上有利于大大简化一些代码。

然后,在不向现有数据帧添加列而是生成列向量之后,将其减少到400mb。虽然这仍然比我预期的要多,但它完全符合我的限制。我的用户都在我的公司,因此我可以控制运行的计算机。