Вот простое решение, которое может работать на вас. Вместо того, чтобы хранить массивы в dict
(чтобы они были в памяти), запишите их в файл. Пока вы осторожны со своими ссылками, они будут очищаться счетчиком ссылок, пока вы не получите к ним доступ снова.
РЕДАКТИРОВАТЬ: Вы можете настроить это, используя npz
файлы для хранения нескольких ключей одновременно, особенно если вам не нужен произвольный доступ.
Код
import tempfile
import numpy
class numpy_dict(dict):
def __setitem__(self, key, value):
with tempfile.NamedTemporaryFile(delete=False) as f:
numpy.save(f, value)
super(numpy_dict, self).__setitem__(key, f.name)
def __getitem__(self, key):
path = super(numpy_dict, self).__getitem__(key)
return numpy.load(path)
Пример использования
>>> import so
>>> import numpy as np
>>> x = so.numpy_dict()
>>> x["a"] = np.zeros((2,2))
>>> x["b"] = np.ones((2,2))
>>> x["a"]
array([[ 0., 0.],
[ 0., 0.]])
>>> x["b"]
array([[ 1., 1.],
[ 1., 1.]])
>>> dict.__getitem__(x, "a")
'/tmp/tmpxIxt0O'
>>> dict.__getitem__(x, "b")
'/tmp/tmpIviN4M'
>>> from sys import getrefcount as refs
>>> x = np.zeros((2,2))
>>> refs(x)
2
>>> x = so.numpy_dict()
>>> y = np.zeros((2,2))
>>> refs(y)
2
>>> x["c"] = y
>>> refs(y)
2