Я являюсь автором пакета под названием klepto
(а также автором dill
). klepto
создан для хранения и извлечения объектов очень простым способом и обеспечивает простой интерфейс словаря для баз данных, кеш-памяти и хранения на диске. Ниже я показываю хранение больших объектов в «архиве каталога», который представляет собой каталог файловой системы с одним файлом на запись.Я выбираю сериализацию объектов (он медленнее, но использует dill
, поэтому вы можете хранить практически любой объект), и я выбираю кеш. Использование кеша памяти позволяет мне иметь быстрый доступ к архиву каталога без необходимости иметь весь архив в памяти. Взаимодействие с базой данных или файлом может быть медленным, но взаимодействие с памятью происходит быстро ... и вы можете заполнить кеш памяти, как вам нравится, из архива.
>>> import klepto
>>> d = klepto.archives.dir_archive('stuff', cached=True, serialized=True)
>>> d
dir_archive('stuff', {}, cached=True)
>>> import numpy
>>> # add three entries to the memory cache
>>> d['big1'] = numpy.arange(1000)
>>> d['big2'] = numpy.arange(1000)
>>> d['big3'] = numpy.arange(1000)
>>> # dump from memory cache to the on-disk archive
>>> d.dump()
>>> # clear the memory cache
>>> d.clear()
>>> d
dir_archive('stuff', {}, cached=True)
>>> # only load one entry to the cache from the archive
>>> d.load('big1')
>>> d['big1'][-3:]
array([997, 998, 999])
>>>
klepto
обеспечивает быстрый и гибкий доступ к большим объемам хранения, и если архив позволяет параллельный доступ (например, некоторые базы данных), то вы можете прочитать результаты параллельно. Также легко поделиться результатами в разных параллельных процессах или на разных машинах. Здесь я создаю второй экземпляр архива, указывающий на тот же архив каталога. Легко передавать ключи между двумя объектами и не отличается от другого процесса.
>>> f = klepto.archives.dir_archive('stuff', cached=True, serialized=True)
>>> f
dir_archive('stuff', {}, cached=True)
>>> # add some small objects to the first cache
>>> d['small1'] = lambda x:x**2
>>> d['small2'] = (1,2,3)
>>> # dump the objects to the archive
>>> d.dump()
>>> # load one of the small objects to the second cache
>>> f.load('small2')
>>> f
dir_archive('stuff', {'small2': (1, 2, 3)}, cached=True)
Вы также можете выбрать из различных уровней сжатия файлов, и хотите ли вы файлы быть отображенный в памяти. Существует множество различных опций , как для файловых серверов, так и для баз данных. Однако интерфейс идентичен.
Что касается ваших других вопросов по сбору мусора и редактированию частей словаря, то оба варианта возможны с klepto
, так как вы можете индивидуально загружать и удалять объекты из кеша памяти, выгружать, загружать и синхронизировать с архивом , или любой из других методов словаря.
Смотрите длинный учебник здесь: https://github.com/mmckerns/tlkklp
Получить klepto
здесь: https://github.com/uqfoundation
Есть несколько сжимающих и других библиотек. Лично мне нравится укроп и H5Py для больших объектов. Если вы используете scikit learn и должны использовать базовую модель в словаре, возможно, вы также можете использовать joblib (только для этих моделей). –