内存泄漏与rpy

时间:2012-09-05 08:08:32

标签: python r memory-leaks rpy2

我的代码中有一小部分与此类似(当然是真实矩阵而不是零填充代码):

x = [rinterface.FloatSexpVector([0]*(1000**2)) for i in xrange(20)]
y = robjects.r('list')(x)

它看起来像是导致内存泄漏。

运行以下代码时:

for i in xrange(10):
    x = [rinterface.FloatSexpVector([0]*(1000**2)) for i in xrange(20)]
    y = robjects.r('list')(x)
    del x
    del y
    robjects.r('gc(verbose=TRUE)')

我明白了:

Error: cannot allocate vector of size 7.6 Mb
In addition: Warning messages:
1: Reached total allocation of 2047Mb: see help(memory.size)
2: Reached total allocation of 2047Mb: see help(memory.size)
3: Reached total allocation of 2047Mb: see help(memory.size)
4: Reached total allocation of 2047Mb: see help(memory.size)

这是一个错误还是我应该做的其他事情?我也尝试将变量命名为robjects.globalenv然后rm() - 在gc()之前将它们命名,但它似乎无法工作。

我应该提一下,我在windows上运行rpy 2.3dev,但这也发生在Linux上的rpy 2.2.6(虽然因为linux运行的是64位版本,而不像Windows机器那样32位,内存只会增长我没有得到2047mb的错误)

修改: 似乎在R gc()之前添加gc.collect()解决了第一个代码示例的问题,但这并没有解决我的问题 - 深入挖掘我的代码我发现引起问题的行是赋值进入.names,类似于:

x = [rinterface.FloatSexpVector([0]*(1000**2)) for i in xrange(20)]
y = robjects.r('list')(x)[0]
y.names = rinterface.StrSexpVector(['a']*len(y))

在清洁之前放置rinterface.NULL也无济于事。 有什么建议吗?

2 个答案:

答案 0 :(得分:2)

可能是因为Python不知道嵌入式R分配的内存量,因此不知道应该收集垃圾。

有一点memory usage in the documentation for rpy2earlier question on SO

您的编辑表明可能会发生一些事情。最好是在rb2的bitbucket页面上提交错误报告,然后继续在那里进行故障排除而不是在这里。

答案 1 :(得分:0)

我不认为它是内存泄漏。我会试着给你以下的观点:

在python shell中尝试这些示例:

l = range(32 * 1024 * 1024)

因此我们尝试使解释器分配128 MB的 连续 内存区域。 这将起作用(我的机器需要约7秒)

你可以玩各种值(它仍然适用于256MB);也尝试N = 128 * 1024 * 1024;从这个价值上来我的机器只是挂起。如果我足够耐心,我可能会在几分钟后让我的机器回来。但问题是解释器不能轻易分配大块的连续内存区域。

值得一提的是,我可以用相同的方式在C ++中分配1GB内存,在同一台机器上只需不到1秒(i7有8GB内存,Windows 8或CentOS6 - 我试过两个操作系统 - ES)。我尝试使用Java也是一样。

我没有花时间研究为什么python堆分配器的行为如此。我只能推测rpy家伙试图阻止/限制你分配太多,所以他们设置了一个下限,以免发生任何不良事件;实际上,你可以有多个较小的数组,其中包含一些引用对象(占用超过4个字节)。