Поддерживать большой словарь в памяти для Django-Python?

У меня есть большой дамп пары key-value, который мне нужен для поиска моего django-Python webapp.

Итак, у меня есть следующие опции:

  • Сохраните его как json дамп и загрузите его как файл python.
  • Сохраните его в dump.py и импортируйте dict из него.
  • Используйте некоторые целевые системы для этой проблемы: [Они действительно предназначены для этой утилиты? ]
    • Mem-кэш
    • Redis
    • Любая другая опция?

Который из вышеперечисленного - правильный путь?

Как вы будете сравнивать memcache и redis?

Update:

  • Мой словарь имеет размер 5 МБ и со временем будет расти.
  • Использование Redis/Memcache добавляет накладные расходы на поражение сокета каждый раз, поэтому dump.py будет лучше, так как потребуется время, чтобы загрузить его в память, но после этого будет выполнять поиск только в памяти.

  • Мой словарь нужно обновлять каждый день, учитывая, что dump.py будет проблемой, так как мы должны перезапустить django-сервер, чтобы перезагрузить, где, как я думаю, это отразится на летать в redis и memcache.

  • Один использует такую ​​систему, как redis, только когда у вас большой объем данных, и вам приходится искать очень часто, в этом случае сокет дает накладные расходы, так как мы достигаем преимущества

Поделитесь своими впечатлениями об этом!

Ответ 1

Для выбора Memcache или REDIS они могут обрабатывать десятки тысяч запросов в секунду на низкоуровневом оборудовании (например, 80 000 req/s для REDIS на C2D Q8300). С задержками значительно ниже 1 мс. Вы говорите, что вы делаете что-то по порядку 20 запросов в секунду, так что производительность мудрая, это действительно не проблема.

Если вы выберете опцию dump.py, вам не нужно перезапускать Django для перезагрузки. Вы можете сделать свой собственный простой перезагрузчик:

dump.py:

[ dict code...]

mtime = 0

Код djago:

import dump #this does nothing if it already loaded
stat = os.stat(dump_filename)
if(stat.mtime > dump.mtime):
    reload(dump)
    dump.mtime = stat.mtime

Ответ 2

Memcached, хотя и отличный продукт, превзойден Redis в моей книге. Он предлагает множество вещей, которые не memcached, как настойчивость.

Он также предлагает более сложные структуры данных, такие как hashses. Каков ваш конкретный дамп данных? Насколько это важно и насколько велики/какие значения?

Ответ 3

В прошлом для аналогичной проблемы я использовал идею dump.py. Я думаю, что для всех других структур данных потребуется слой для преобразования объектов одного вида в объекты python. Однако я все же думаю, что это будет зависеть от размера данных и объема данных, которые вы обрабатываете. Memcache и redis должны иметь лучшую индексацию и искать, когда дело доходит до действительно больших наборов данных и таких вещей, как поиск на основе регулярных выражений. Поэтому моя рекомендация была бы

json - если вы обслуживаете данные через http для какой-либо другой службы файл python - если структура данных не слишком велика и вам не нужен какой-либо особый вид ups

memcache и redis - если данные становятся действительно большими

Ответ 4

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

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