У меня есть небольшая часть в моем коде, похожая на эту (конечно, с реальными матрицами вместо заполненных нулями):
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(), но это, похоже, не работает.
Я должен упомянуть, что я запускаю rpy 2.3dev в Windows, но это происходит и в Linux с rpy 2.2.6 (хотя, поскольку Linux работает с 64-битными версиями, а не с 32-битными, как на машине с Windows, память просто увеличивается, и я не получить ошибку 2047mb)
EDIT: кажется, что добавление gc.collect() до того, как R gc() решит проблему с первым примером кода, однако это не решило мою проблему - углубившись в мой код, я обнаружил, что строка это вызывает проблему с присвоением значения .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 перед очисткой тоже не помогает. какие-либо предложения?