2011-06-01 46 views
0

我需要在Google應用引擎中實現「逆文檔頻率」。我正在尋求提高效率的建議。現在我走基本例程如,在GAE上實施「逆文檔頻率」的建議?

解析網頁時我保存每一對數據存儲,等,

for(String phrase : phrase_collection){ 
    dataStore.put(phrase, domain); 
} 
計算IDF時

以後我取從數據存儲中的短語的出現,如,

for(String phrase : phrase_collection){ 
    long count = dataStore.get(phrase).size(); 
} 

但是速度並不令人滿意,並且經常導致30秒的超時。在這種情況下,我有額外的挑戰,

- 多語言輸入(網頁)。所以這些短語也使用不同的語言,這使得緩存很難。

-Parsing網頁和排名短語也需要很多時間。整個過程就像charset_detect - > language_detect - >根據不同的語言解析 - >排名。

始終在GAE中啓用。

我期待着任何建議!提前致謝!

回答

1

你正在爲每個短語做一個單獨的獲取(並放置)。這自然會非常緩慢,因爲您正在向數據存儲進行大量往返。相反,您應該使用putget的變體,它們接受實體或鍵的迭代,並在單個事務中執行它們。

你也應該做'脫機'這個工作 - 就像斯特凡建議的那樣,使用後端或任務隊列。任務隊列在這裏可能會更好。

+0

無論如何很難組裝Query查詢條件,批量get/put是一個基本的想法。此外,由於我需要實時對文檔進行排序(來自同一文檔),所以我無法離線執行此操作。我試着與緩存和AsyncDataStore,它感覺更好。 – ShuaiYuan 2011-06-03 07:27:07

+0

@Shuai我不知道我理解你的評論。查詢條件不適用於批次獲取或放入,而且您需要批量操作 - 這也應該很容易。 – 2011-06-03 08:15:21

+0

我的意思是1)很難從數據存儲中檢索所有短語並將其存儲在內存緩存中,尤其是,存儲在所有語言中都在迅速增長。 2)那麼對於每個文件,我必須檢索出現在其中的短語而不是全部。在這種情況下,你如何批量獲得? – ShuaiYuan 2011-06-04 10:03:15

0

你有兩個選擇:

你可以使用新引進的後端得到的東西和運行。這樣,您不必處理超時,也不必擔心並行任務。

您可以使用任務隊列。 (作爲後端的替代品)。但這取決於你的任務平行的能力。

無論如何,你應該開始使用memcache。 (如果你使用JDO,你可以簡單地啓用它like so)。您也可以考慮切換到「更原生」的持久層,如objectify或twig,它們支持開箱即用的訪問和/或memcache。

+0

謝謝!我會先嚐試後端。 – ShuaiYuan 2011-06-01 14:47:44