我的Python高複製數據存儲應用程序需要一個100,000和1,000,000條目之間的大型查找表。我需要能夠爲某個方法提供代碼,以返回與該代碼關聯的值(如果沒有關聯,則返回None)。例如,如果我的表格擁有可接受的英語單詞,那麼我希望該函數在找到該單詞時返回True,否則返回False(或None)。GAE查找表與事務不兼容?
我目前的實現是爲每個表條目創建一個無父實體,併爲該實體包含任何關聯的數據。我將該實體的數據存儲關鍵字設置爲與我的查找代碼相同。 (我把所有的實體放到它們自己的名字空間中以防止任何鍵衝突,但這對於這個問題並不重要)。然後,我只需在代碼上調用get_by_key_name(),並獲取關聯的數據。
問題是我無法在事務中訪問這些實體,因爲我試圖跨越實體組。所以回到我的例子中,假設我想拼寫檢查聊天會話中使用的所有單詞。我可以訪問聊天中的所有消息,因爲我會給他們一個共同的祖先,但我無法訪問我的單詞表,因爲那裏的條目是無父母的。我必須能夠在交易過程中參考表格。
請注意,我的查找表是固定的,或者很少改變。這又匹配拼寫檢查示例。
一個解決方案可能是在一次交易中加載聊天會話中的所有單詞,然後拼寫檢查它們(保存結果),然後開始第二個交易,對照保存的結果進行拼寫檢查。但是,這不僅效率低下,聊天會話可能已被添加到事務之間。這似乎是一個笨拙的解決方案。
理想情況下,我想告訴GAE查找表是不可變的,因此,我應該能夠查詢它,而不必抱怨事務中的跨越實體組。然而,我看不出有任何辦法可以做到這一點。
將表項存儲在內存緩存中很誘人,但也存在問題。這是一個大量的數據,但更麻煩的是,如果GAE引出一個memcache條目,我將無法在事務中重新加載它。
有誰知道大型全局查找表的合適實現嗎?
請理解,我不是在尋找一個拼寫檢查Web服務或類似的東西。我只是使用單詞查找作爲示例來明確此問題,並且我希望爲任何類型的大型查找表提供一個通用解決方案。
+1建議將它放入內存中。對於固定數據,這可能是最佳的。 – SingleNegationElimination
關於您的第一個建議,我是否正確理解可以將表保存在數據存儲中,然後在開始我的事務之前將整個表讀入實例內存?這將工作,但表佔用3MB的東西,我只需要少量的表查找。因此,當我需要的是幾百字節時,我會以3MB讀取,這聽起來效率不高。或者你還在建議其他東西?實例內存無法繼續存在請求(除了寫入memcache)嗎? (並感謝您的回覆 - 在週日晚上不會少於!) – Dragonfly
至於您的其他想法,我瞭解「修訂財產」的想法,並可以與此一起去。我還沒有了解blobstore或後端,所以我會研究下一步。我喜歡使用後端的聲音;這個解決方案有什麼缺點嗎?附:我仍然認爲GAE支持任何事務可以訪問的不可變數據存儲實體是一個好主意! – Dragonfly