Использование словаря Python в качестве временной базы данных значений ключей в памяти? - PullRequest
5 голосов
/ 21 марта 2012

Мне нужно что-то вроде временного хранилища ключей в памяти.Я знаю, что есть решения, такие как Redis.Но мне интересно, если использование словаря Python может работать?И потенциально быть еще быстрее?Итак, подумайте, что сервер Tornado (или аналогичный) работает и содержит словарь python в памяти и просто возвращает соответствующее значение на основе HTTP-запроса.

Зачем мне это нужно?В качестве части службы хранятся ключевые значения, но у них есть это свойство: чем они свежее, тем выше вероятность их доступа.Поэтому я хочу сохранить последние 100 ключевых значений в памяти (а также записать на диск) для более быстрого поиска.

Если сервер умирает, словарь можно восстановить с диска.

Имееткто-нибудь сделал что-то подобное?Я что-то здесь упускаю?

PS: я думаю, что это невозможно с сервером WSGI, верно?Потому что, насколько я знаю, между отдельными запросами нельзя что-то хранить в памяти.

Ответы [ 6 ]

4 голосов
/ 21 марта 2012

Я бы определенно работал с memcached. После настройки вы можете легко украсить свои функции / методы, как это было сделано в моем примере:

#!/usr/bin/env python

import time
import memcache
import hashlib

def memoize(f):

    def newfn(*args, **kwargs):
        mc = memcache.Client(['127.0.0.1:11211'], debug=0)
        # generate md5 out of args and function
        m = hashlib.md5()
        margs = [x.__repr__() for x in args]
        mkwargs = [x.__repr__() for x in kwargs.values()]
        map(m.update, margs + mkwargs)
        m.update(f.__name__)
        m.update(f.__class__.__name__)
        key = m.hexdigest()

        value = mc.get(key)
        if value:
            return value
        else:
            value = f(*args, **kwargs)
            mc.set(key, value, 60)
            return value
        return f(*args)

    return newfn

@memoize
def expensive_function(x):
    time.sleep(5)
    return x

if __name__ == '__main__':
    print expensive_function('abc')
    print expensive_function('abc')

Не беспокойтесь о задержке в сети, так как такая оптимизация будет тратить ваше время.

3 голосов
/ 17 января 2013

Действующий словарь Python на способ быстрее, чем сервер memcached. В соответствии с неточным тестом, который я выполнил несколько дней назад, один запрос занимает около 2 с использованием словаря Python, находящегося в процессе, и около 50 с использованием сервера memcached, прослушивающего localhost. В моем тесте я использовал libmemcached в качестве C-клиента и python-libmemcached в качестве оболочки Python поверх этого C-клиента.

1 голос
/ 11 июля 2013

Я экспериментирую с чем-то похожим, и библиотека corecache - отличный способ протестировать несколько систем кэширования.https://pypi.python.org/pypi/cachecore

В частности, их реализация SimpleCache опирается на ванильный python dict, и в моих предварительных тестах это чрезвычайно быстро, в 10 раз быстрее, чем вызов memcached локально (при условии, что я уже нахожусь в приложении python, которому нужно кэширование, вероятно, служба торнадо в вашем случае).

0 голосов
/ 23 марта 2012
  1. Вы можете просто кешировать последние данные в dict, никто не запрещает об этом, и это работает в среде с одним сервером
  2. Когда добавляются новые данные - сохраните их в каком-либо redis (memcachedb)
  3. Когда сервер перезагружается - просто загрузите новейшие N записей в словарь

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

0 голосов
/ 21 марта 2012

Это возможно, и это намного быстрее, чем redis / memcache из-за отсутствия задержки в сети.Вы можете использовать cPickle для сброса словаря время от времени.Хотя это сложно, если ваша программа порождает подпроцессы, то обновление значений в одном процессе не влияет на другой.

0 голосов
/ 21 марта 2012

Если вы объединяете словарь на тот же сервер, на котором работает ваша реальная служба, то да, это будет работать нормально.


Если вы создаете отдельные вещи, ну, в основном это то, для чего memcached. Не изобретай велосипед.

...