Я думаю, что это ошибка, и, возможно, я нашел решение: позвоните "del data.f".
for i in xrange(10000000):
data = np.load('tmp.npz')
del data.f
data.close() # avoid the "too many files are open" error
для обнаружения утечки памяти такого типа.Вы можете использовать следующий код:
import numpy as np
import gc
# here come the overflow:
for i in xrange(10000):
data = np.load('tmp.npz')
data.close() # avoid the "too many files are open" error
d = dict()
for o in gc.get_objects():
name = type(o).__name__
if name not in d:
d[name] = 1
else:
d[name] += 1
items = d.items()
items.sort(key=lambda x:x[1])
for key, value in items:
print key, value
После тестовой программы я создал объекты dict и count в gc.get_objects ().Вот вывод:
...
wrapper_descriptor 1382
function 2330
tuple 9117
BagObj 10000
NpzFile 10000
list 20288
dict 21001
Из результата мы знаем, что что-то не так с BagObj и NpzFile.Найдите код:
class NpzFile(object):
def __init__(self, fid, own_fid=False):
...
self.zip = _zip
self.f = BagObj(self)
if own_fid:
self.fid = fid
else:
self.fid = None
def close(self):
"""
Close the file.
"""
if self.zip is not None:
self.zip.close()
self.zip = None
if self.fid is not None:
self.fid.close()
self.fid = None
def __del__(self):
self.close()
class BagObj(object):
def __init__(self, obj):
self._obj = obj
def __getattribute__(self, key):
try:
return object.__getattribute__(self, '_obj')[key]
except KeyError:
raise AttributeError, key
NpzFile имеет del (), NpzFile.f - это BagObj, а BagObj._obj - это NpzFile, это ссылочный цикл, который вызовет и NpzFileBagObj не коллекционируется.Вот некоторые пояснения в документе Python: http://docs.python.org/library/gc.html#gc.garbage
Итак, чтобы разорвать ссылочный цикл, потребуется вызвать «del data.f»