我正在开发一个在云端运行的封闭系统。
我需要的是一个搜索功能,它使用用户输入的regexp来过滤数据集中的行。
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秒钟。
要解决任何答案,例如“index it and use .filter()” - 查询是一个正则表达式,我不知道任何允许使用正则表达式的索引机制。
答案 0 :(得分:2)
您还可以使用cachepy或performance engine(无耻插件)将数据存储在应用引擎的本地实例上,这样您就可以更快地访问所有实体,而不受内存缓存边界或数据存储延迟的限制。
提示:如果本地实例超过大约185 MB的内存,它就会被杀死,所以如果你知道自己在做什么,你可以在其中存储相当多的数据。
答案 1 :(得分:1)
由于条目数量有限,您可以记忆所有条目,然后像您概述的那样在内存中进行过滤。但是,请注意每个memcache条目不能超过1mb。但是你可以并行获取最多32mb的memcache条目。
因此将条目拆分为子集,memcache子集,然后通过预先计算memcache密钥并行读取它们。
更多信息:
http://code.google.com/appengine/docs/python/memcache/functions.html
答案 2 :(得分:1)
由于您的数据大约为20MB,因此您可以将其完全加载到本地实例内存中,这将尽可能快地加载。或者,您可以将其作为数据文件存储在应用旁边,阅读速度比访问数据存储区要快。