Загрузка большого словаря с использованием python pickle

У меня есть полный инвертированный индекс в виде вложенного словаря Python . Его структура следующая:

{word : { doc_name : [location_list] } }

Например, пусть словарь будет называться index, тогда для слова «спам» запись будет выглядеть так:

{ spam : { doc1.txt : [102,300,399], doc5.txt : [200,587] } }

Я использовал эту структуру, поскольку python dict довольно оптимизирован и упрощает программирование.

для любого слова «спам», содержащие его документы могут быть предоставлены по:

index['spam'].keys()

, а список сообщений для документа doc1 по:

index['spam']['doc1']

В настоящее время я использую cPickle для хранения и загрузки этого словаря. Но обработанный файл имеет размер около 380 МБ и занимает много времени для загрузки - 112 секунд (примерно, я рассчитал его с помощью time.time () ), а использование памяти достигло 1,2 ГБ (системный монитор Gnome). Как только он загрузится, все в порядке. У меня 4 ГБ ОЗУ.

len (index.keys ()) дает 229758

Код

import cPickle as pickle

f = open('full_index','rb')
print 'Loading index... please wait...'
index = pickle.load(f)  # This takes ages
print 'Index loaded. You may now proceed to search'

Как ускорить его загрузку? Мне нужно загрузить его только один раз, когда приложение начинается. После этого важно время доступа для ответа на запросы.

Следует ли мне переключиться на такую ​​базу данных, как SQLite, и создать индекс по ее ключам? Если да, то как мне сохранить значения, чтобы иметь эквивалентную схему, которая упрощает поиск. Есть ли что-нибудь еще, что мне следует изучить?

Приложение

Используя ответ Тима pickle.dump (index, file, -1) консервированный файл значительно меньше - около 237 МБ (для сброса потребовалось 300 секунд) ... и теперь загрузка занимает половину времени (61 секунда ... в отличие от 112 секунд ранее .... time.time () )

Но следует ли мне перейти на базу данных для масштабируемости?

На данный момент я помечаю ответ Тима как принятый.

PS: Я не хочу использовать Lucene или Xapian ... Этот вопрос относится к Хранение инвертированного индекса . Мне пришлось задать новый вопрос, потому что я не смог удалить предыдущий.

10
задан Community 23 May 2017 в 11:46
поделиться