Вы действительно нуждаетесь в этом, чтобы загрузить все сразу?Если вам не нужно все это в памяти, а только выбранные части, которые вы хотите в любой момент времени, вы можете сопоставить свой словарь с набором файлов на диске, а не с одним файлом ... или сопоставить диктовку стаблица базы данных.Итак, если вы ищете что-то, что сохраняет большие словари данных на диск или в базу данных, и может использовать выборку и кодирование (кодеки и хеш-карты), то вы можете посмотреть на klepto
.
klepto
предоставляет словарную абстракцию для записи в базу данных, включая обработку вашей файловой системы как базы данных (т.е. запись всего словаря в один файл или запись каждой записи в свой собственный файл).Для больших данных я часто выбираю представление словаря в качестве каталога в моей файловой системе, и каждая запись должна быть файлом.klepto
также предлагает алгоритмы кэширования, поэтому, если вы используете файловую систему для словаря, вы можете избежать некоторого снижения скорости, используя кэширование памяти.
>>> from klepto.archives import dir_archive
>>> d = {'a':1, 'b':2, 'c':map, 'd':None}
>>> # map a dict to a filesystem directory
>>> demo = dir_archive('demo', d, serialized=True)
>>> demo['a']
1
>>> demo['c']
<built-in function map>
>>> demo
dir_archive('demo', {'a': 1, 'c': <built-in function map>, 'b': 2, 'd': None}, cached=True)
>>> # is set to cache to memory, so use 'dump' to dump to the filesystem
>>> demo.dump()
>>> del demo
>>>
>>> demo = dir_archive('demo', {}, serialized=True)
>>> demo
dir_archive('demo', {}, cached=True)
>>> # demo is empty, load from disk
>>> demo.load()
>>> demo
dir_archive('demo', {'a': 1, 'c': <built-in function map>, 'b': 2, 'd': None}, cached=True)
>>> demo['c']
<built-in function map>
>>>
klepto
также имеет другие флаги, такие как compression
и memmode
, которые можно использовать для настройки хранения ваших данных (например, уровня сжатия, режима карты памяти и т. д.).В равной степени легко (точно такой же интерфейс) использовать базу данных (MySQL и т. Д.) В качестве бэкэнда вместо вашей файловой системы.Вы также можете отключить кеширование памяти, поэтому каждое чтение / запись идет непосредственно в архив, просто установив cached=False
.
klepto
, обеспечивающий доступ к настройке вашей кодировки, путем создания пользовательского keymap
.
>>> from klepto.keymaps import *
>>>
>>> s = stringmap(encoding='hex_codec')
>>> x = [1,2,'3',min]
>>> s(x)
'285b312c20322c202733272c203c6275696c742d696e2066756e6374696f6e206d696e3e5d2c29'
>>> p = picklemap(serializer='dill')
>>> p(x)
'\x80\x02]q\x00(K\x01K\x02U\x013q\x01c__builtin__\nmin\nq\x02e\x85q\x03.'
>>> sp = s+p
>>> sp(x)
'\x80\x02UT28285b312c20322c202733272c203c6275696c742d696e2066756e6374696f6e206d696e3e5d2c292c29q\x00.'
klepto
также предоставляет множество алгоритмов кэширования (например, mru
, lru
, lfu
и т. Д.), Которые помогут вам управлять кэшем в памяти и будут использоватьАлгоритм делает дамп и загружает в бэкэнд архива.
Вы можете использовать флаг cached=False
, чтобы полностью отключить кеширование памяти, и напрямую читать и записывать на диск или базу данных.Если ваши записи достаточно велики, вы можете выбрать запись на диск, где вы поместите каждую запись в отдельный файл.Вот пример, который делает и то, и другое.
>>> from klepto.archives import dir_archive
>>> # does not hold entries in memory, each entry will be stored on disk
>>> demo = dir_archive('demo', {}, serialized=True, cached=False)
>>> demo['a'] = 10
>>> demo['b'] = 20
>>> demo['c'] = min
>>> demo['d'] = [1,2,3]
Однако, хотя это должно значительно сократить время загрузки, это может немного замедлить общее выполнение ... обычно лучше указать максимальную сумму, которая будет храниться в кеше памяти, и выбратьхороший алгоритм кеширования.Вы должны играть с ним, чтобы получить правильный баланс для ваших нужд.
Получите klepto
здесь: https://github.com/uqfoundation