内存泄漏与rpy

ita*_*tai 5 python memory-leaks r rpy2

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

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

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

运行以下代码时:

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)')
Run Code Online (Sandbox Code Playgroud)

我明白了:

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)
Run Code Online (Sandbox Code Playgroud)

这是一个错误还是我应该做的其他事情?我也尝试将变量命名为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))
Run Code Online (Sandbox Code Playgroud)

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

lga*_*ier 2

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

rpy2 的文档中有一些关于内存使用的信息,以及关于 SO 的早期问题

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