2011-07-11 41 views
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()”的任何答案 - 查询是一个正则表达式,我不知道任何索引机制,将允许使用正则表达式。

回答

1

由于存在有限数量的条目,因此可以对所有条目执行memcache,然后按照您所述的方式在内存中执行过滤。但是请注意,每个memcache条目不能超过1mb。但是,您可以并行读取多达32MB的memcache条目。

因此,将条目分成子集,memcache子集,然后通过预计算memcache密钥并行读取它们。

这里更多:

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

2

您还可以使用cachepyperformance engine(无耻插头)存储在App Engine的本地实例的数据,这样你就可以拥有所有实体更快的访问,而无需通过得到限制memcache边界或数据存储延迟。

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

+0

那边的好工作:) – systempuntoout

1

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

+0

我该如何将东西加载到本地实例内存中? – kolinko

+0

@Merlin将它们作为全局变量(或类变量)存储在模块中。 –

相关问题