2

我正在开发一个在云中运行的封闭系统。

我需要的是一个搜索功能,它使用用户输入的正则表达式来过滤数据集中的行。

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 秒?或者也许是并行化它?我不介意 10cpu 秒,但我确实介意用户必须等待 10 秒。

要解决诸如“索引它并使用 .filter()”之类的任何答案 - 查询是一个正则表达式,我不知道任何允许使用正则表达式的索引机制。

4

3 回答 3

2

您还可以使用cachepy性能引擎(无耻插件)将数据存储在应用引擎的本地实例上,这样您就可以更快地访问所有实体,而不受内存缓存边界或数据存储延迟的限制。

提示:如果本地实例超过大约 185 MB 的内存,它就会被杀死,所以如果你知道你在做什么,你实际上可以在其中存储相当多的数据。

于 2011-07-11T20:00:55.937 回答
1

由于条目的数量是有限的,因此您可以缓存所有条目,然后像您概述的那样在内存中进行过滤。但是请注意,每个 memcache 条目不能超过 1mb。但是您最多可以并行获取 32mb 的 memcache 条目。

因此,将条目拆分为子集,memcache 子集,然后通过预先计算 memcache 键并行读取它们。

更多在这里:

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

于 2011-07-11T17:22:08.230 回答
1

由于您的数据大约为 20MB,因此您可以将其完全加载到本地实例内存中,这将尽可能快。或者,您可以将其作为数据文件存储在您的应用程序旁边,读取这将比访问数据存储区更快。

于 2011-07-12T01:18:16.343 回答