0

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

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

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

我也试过 gc() 无济于事。如果我执行 gcinfo(TRUE) 然后 gc() 它告诉我它正在使用类似 38mb 的内存。但是活动监视器高达 12gb,并且速度变慢可能是由于高清上的分页。

我尝试通过一个 bash 脚本调用它,在该脚本中我做了 ulimit -v 800000 但没有用。

我还可以做些什么?

4

2 回答 2

1

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

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

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

于 2012-11-12T03:55:11.187 回答
0

对于没有使用代码发布更全面的描述,我深表歉意。它和输入一样长。但是我在这里得到的回复仍然很有帮助。这是我主要解决问题的方法。

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

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

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

然后在不向现有数据帧添加列而是制作列向量之后,将其减少到 400mb。虽然这仍然超出了我的预期,但它完全在我的限制范围内。我的用户都在我的公司里,所以我可以控制它在哪些计算机上运行。

于 2012-11-16T00:17:45.730 回答