Есть ли способ кэшировать вывод выборки? - PullRequest
2 голосов
/ 11 июля 2011

Я работаю в закрытой системе, работающей в облаке.

Мне нужна функция поиска, использующая введенное пользователем регулярное выражение для фильтрации строк в наборе данных.

phrase = re.compile(request.get("query"))
data = Entry.all().fetch(50000)  #this takes around 10s when there are 6000 records
result = x for x in data if phrase.search(x.title)

Теперь сама база данных не будет сильно меняться, и в день будет выполняться не более 200-300 запросов.

Есть ли способ каким-либо образом кэшировать все записи (я ожидаю, чтоих будет не более 50 000, каждый размером не более 500 байт), поэтому их получение не займет более 10 секунд?Или возможно распараллелить это?Я не возражаю против 10 cpu секунд, но я возражаю против 10 секунд, которые пользователь должен ждать.

Чтобы ответить на любые ответы, такие как «индексировать его и использовать .filter ()» - запрос является регулярным выражением, иЯ не знаю ни о каком механизме индексации, который позволил бы использовать регулярное выражение.

Ответы [ 3 ]

2 голосов
/ 12 июля 2011

Вы также можете использовать cachepy или механизм производительности (бесстыдный плагин) для хранения данных на локальных экземплярах ядра приложения, чтобы вы могли иметь более быстрый доступ ко всем объектам без ограниченияграницы memcache или латентность хранилища данных.

Подсказка: Локальный экземпляр уничтожается, если он превышает 185 МБ памяти, поэтому вы можете хранить в нем довольно много данных, если знаете, что делаете.

1 голос
/ 12 июля 2011

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

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

Поскольку количество записей ограничено, вы можете запоминать все записи, а затем выполнять фильтрацию в памяти, как вы наметили. Однако обратите внимание, что каждая запись memcache не может превышать 1 МБ. Но вы можете извлечь до 32 Мбайт записей кэша памяти параллельно.

Итак, разбейте записи на подмножества, запишите в кэш подмножества и затем прочитайте их параллельно, предварительно вычислив ключ memcache.

Подробнее здесь:

http://code.google.com/appengine/docs/python/memcache/functions.html

...