Как сохранить большие (не огромные) диктонары в Python? - PullRequest
4 голосов
/ 10 февраля 2012

Мой словарь будет состоять из нескольких тысяч ключей, каждый из которых имеет массив значений 1000x1000 в качестве значения. Мне не нужно, чтобы файл читался человеком. Малый размер и быстрое время загрузки более важны.

Сначала я попробовал savemat , но столкнулся с проблемами . Pickle привело к огромному файлу. Я предполагаю, что то же самое для CSV. Я читал сообщения, рекомендующие использовать json (читаемый текст, вероятно, огромный) или дБ (предположительно сложный). Что бы вы посоветовали для моего случая?

Ответы [ 5 ]

6 голосов
/ 10 февраля 2012

Если у вас есть словарь, в котором ключи - это строки, а значения - это массивы, например:

>>> import numpy
>>> arrs = {'a': numpy.array([1,2]),
            'b': numpy.array([3,4]),
            'c': numpy.array([5,6])}

Вы можете использовать numpy.savez , чтобы сохранить их по ключу,в сжатый файл:

>>> numpy.savez('file.npz', **arrs)

Чтобы загрузить его обратно:

>>> npzfile = numpy.load('file.npz')
>>> npzfile
<numpy.lib.npyio.NpzFile object at 0x1fa7610>
>>> npzfile['a']
array([1, 2])
>>> npzfile['b']
array([3, 4])
>>> npzfile['c']
array([5, 6])
3 голосов
/ 10 февраля 2012

Сама файловая система часто является недооцененной структурой данных. У вас может быть словарь, представляющий собой карту ваших ключей к именам файлов, и тогда в каждом файле будет массив 1000x1000. Выбор словаря будет быстрым и легким, и тогда файлы данных могут просто содержать необработанные данные (которые легко может загрузить numpy).

2 голосов
/ 10 февраля 2012

Как насчет numpy.savez ?Он может сохранять несколько массивов numpy, и они являются двоичными, поэтому он должен быть быстрее, чем pickle.

0 голосов
/ 11 февраля 2012

Вы можете использовать PyTables (http://www.pytables.org/moin), и сохранить ваши данные в формате HDF5.

0 голосов
/ 10 февраля 2012

Спецификация Google Protobuf разработана таким образом, чтобы быть чрезвычайно эффективной при накладных расходах. Я не уверен, насколько быстро (де) сериализуется, но, будучи Google, я думаю, что это не потертый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...