Самый быстрый способ сохранить и загрузить большой словарь в Python - PullRequest
14 голосов
/ 09 марта 2011

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

Ответы [ 5 ]

14 голосов
/ 09 марта 2011

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

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

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

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

2 голосов
/ 09 марта 2011

Sqlite

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

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

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

1 голос
/ 12 февраля 2017

Я знаю, что это старый вопрос, но он является обновлением для тех, кто все еще ищет ответ на этот вопрос: аргумент 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)
1 голос
/ 09 марта 2011

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

0 голосов
/ 09 марта 2011

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

...