2011-07-11 38 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將它們作爲全局變量(或類變量)存儲在模塊中。 –

相關問題