2016-11-24 3 views
0

У меня есть очень большой словарь размером ~ 200 ГБ, который мне очень часто нужно запрашивать для моего алгоритма. Чтобы получить быстрые результаты, я хочу поместить его в память, что возможно, потому что, к счастью, у меня 500 ГБ оперативной памяти.Как сохранить очень большой словарь, загруженный в память в python?

Однако основная проблема заключается в том, что я хочу загрузить его только один раз в памяти, а затем позволить другим процессам запрашивать один и тот же словарь, а не загружать его каждый раз, когда я создаю новый процесс или перебираю свой код.

Итак, я хотел бы что-то вроде этого:

Сценарий 1:

# Load dictionary in memory 
def load(data_dir): 
    dictionary = load_from_dir(data_dir) ... 

Сценарий 2:

# Connect to loaded dictionary (already put in memory by script 1) 
def use_dictionary(my_query): 
    query_loaded_dictionary(my_query) 

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

Любые предложения?

+0

Возможно, использование чего-то вроде redis было бы полезным. –

+0

Да, redis - тоже хорошая идея. Мне было интересно, есть ли способ сделать это в python. Я ранее пытался mongodb, но последняя версия wongtiger mongodb, не имеет возможности предварительно загрузить все данные в памяти. Проблема в том, что у меня нет пароля root, поэтому я не хотел устанавливать слишком много программного обеспечения. Но позвольте мне попробовать redis. –

+0

Вы пытаетесь заново изобрести базы данных NOSQL? Почему бы не полагаться на существующие? –

ответ

1

Либо запустите отдельную службу, к которой вы обращаетесь с помощью REST API, как вы упомянули, или используйте базу данных в памяти.

У меня был очень хороший опыт работы с Redis лично, но есть много других (Memcached также популярен). Redis был прост в использовании с Python и Django.

В обоих решениях может быть сериализация данных, хотя, поэтому некоторые характеристики будут удалены. Есть способ заполнить Redis простыми структурами, такими как списки, но я не пробовал. Я упаковал свои числовые массивы и сериализовал их (с numpy), в конце концов, он был достаточно быстрым. Если вы все равно используете простые пары «ключ-значение», то производительность будет оптимальной и, возможно, лучше с memcached.

Смежные вопросы