Подтвердить что ты не робот

Самый быстрый способ сохранить и загрузить большой словарь в Python

У меня относительно большой словарь. Как узнать размер? хорошо, когда я сохраняю его с помощью cPickle размер файла будет увеличиваться ок. 400MB. cPickle предполагается намного быстрее, чем pickle, но загрузка и сохранение этого файла занимает много времени. У меня двухъядерный ноутбук 2,6 ГГц с 4 ГБ оперативной памяти на Linux-машине. Есть ли у кого-нибудь предложения по более быстрой экономии и загрузке словарей в python? спасибо

4b9b3361

Ответ 1

Используйте параметр protocol = 2 в cPickle. Протокол по умолчанию (0) работает намного медленнее и создает гораздо большие файлы на диске.

Если вы просто хотите работать с более крупным словарем, чем может удерживать память, модуль shelve - это хорошее быстрое и грязное решение. Он действует как in-memory dict, но сохраняет себя на диске, а не в памяти. shelve основан на cPickle, поэтому не забудьте установить протокол на что-либо, кроме 0.

Преимущества базы данных, такие как sqlite над cPickle, будут зависеть от вашего варианта использования. Как часто вы будете писать данные? Сколько раз вы ожидаете прочитать каждую запись, которую вы пишете? Будете ли вы когда-либо выполнять поиск данных, которые вы пишете, или загружать их за один раз?

Если вы выполняете однократную запись, чтение-много и загрузку одной части за раз, используйте средства базы данных. Если вы пишете один раз, прочитайте один раз, cPickle (с любым протоколом, отличным от протокола по умолчанию = 0) будет трудно превзойти. Если вы просто хотите большой, постоянный dict, используйте полку.

Ответ 2

Sqlite

Возможно, стоит сохранить данные в базе данных Sqlite. Хотя при перестройке вашей программы для работы с Sqlite будут некоторые накладные расходы на разработку, также становится намного проще и результативно запрашивать базу данных.

Вы также получаете транзакции, атомарность, сериализацию, сжатие и т.д. бесплатно.

В зависимости от того, какую версию Python вы используете, у вас уже может быть встроенный sqlite.

Ответ 3

Я знаю, что это старый вопрос, но как обновление для тех, кто все еще ищет ответ на этот вопрос: Аргумент protocol был обновлен в python 3, и теперь есть еще более быстрые и эффективные варианты (т.е. protocol=3 и protocol=4), которые могут не работать под python 2. Вы можете прочитать об этом больше в ссылка.

Чтобы всегда использовать лучший протокол, поддерживаемый используемой версией python, вы можете просто использовать pickle.HIGHEST_PROTOCOL. Следующий пример берется из ссылка:

import pickle
# ...
with open('data.pickle', 'wb') as f:
    # Pickle the 'data' dictionary using the highest protocol available.
    pickle.dump(data, f, pickle.HIGHEST_PROTOCOL)

Ответ 4

Вы можете протестировать компрессию своего словаря (с некоторыми ограничениями см.: этот пост), это будет эффективно, если доступ к диску является узким местом.

Ответ 5

Это много данных... В каком содержимом есть ваш словарь? Если это только примитивные или фиксированные типы данных, возможно, реальная база данных или пользовательский формат файла - лучший вариант?

Ответ 6

Я попробовал это для многих проектов и пришел к выводу, что shelve быстрее, чем pickle, сохраняет данные. Оба выполняют то же самое при загрузке данных. Shelve на самом деле грязное решение. Это потому, что вы должны быть очень осторожны с этим. Если вы не закрываете файл shelve после его открытия или по какой-либо причине в вашем коде происходит прерывание, когда вы находитесь в процессе его открытия и закрытия, у файла shelve есть большая вероятность повреждения ( что приводит к разочарованию KeyErrors); что действительно раздражает, учитывая, что мы, кто их используем, заинтересованы в них из-за хранения наших БОЛЬШИХ файлов dict, которые, очевидно, также заняли много времени для создания И именно поэтому полки - грязное решение... Это все еще быстрее, хотя. Так!