我的代码中有一小部分与此类似(当然使用实数矩阵而不是零填充的):
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()-ing 在 gc() 之前将它们命名为变量,但它似乎不起作用。
我应该提到我在 Windows 上运行 rpy 2.3dev 但这也发生在 rpy 2.2.6 的 linux 上(尽管由于 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 也无济于事。有什么建议么?