0

我的Python高複製數據存儲應用程序需要一個100,000和1,000,000條目之間的大型查找表。我需要能夠爲某個方法提供代碼,以返回與該代碼關聯的值(如果沒有關聯,則返回None)。例如,如果我的表格擁有可接受的英語單詞,那麼我希望該函數在找到該單詞時返回True,否則返回False(或None)。GAE查找表與事務不兼容?

我目前的實現是爲每個表條目創建一個無父實體,併爲該實體包含任何關聯的數據。我將該實體的數據存儲關鍵字設置爲與我的查找代碼相同。 (我把所有的實體放到它們自己的名字空間中以防止任何鍵衝突,但這對於這個問題並不重要)。然後,我只需在代碼上調用get_by_key_name(),並獲取關聯的數據。

問題是我無法在事務中訪問這些實體,因爲我試圖跨越實體組。所以回到我的例子中,假設我想拼寫檢查聊天會話中使用的所有單詞。我可以訪問聊天中的所有消息,因爲我會給他們一個共同的祖先,但我無法訪問我的單詞表,因爲那裏的條目是無父母的。我必須能夠在交易過程中參考表格。

請注意,我的查找表是固定的,或者很少改變。這又匹配拼寫檢查示例。

一個解決方案可能是在一次交易中加載聊天會話中的所有單詞,然後拼寫檢查它們(保存結果),然後開始第二個交易,對照保存的結果進行拼寫檢查。但是,這不僅效率低下,聊天會話可能已被添加到事務之間。這似乎是一個笨拙的解決方案。

理想情況下,我想告訴GAE查找表是不可變的,因此,我應該能夠查詢它,而不必抱怨事務中的跨越實體組。然而,我看不出有任何辦法可以做到這一點。

將表項存儲在內存緩存中很誘人,但也存在問題。這是一個大量的數據,但更麻煩的是,如果GAE引出一個memcache條目,我將無法在事務中重新加載它。

有誰知道大型全局查找表的合適實現嗎?

請理解,我不是在尋找一個拼寫檢查Web服務或類似的東西。我只是使用單詞查找作爲示例來明確此問題,並且我希望爲任何類型的大型查找表提供一個通用解決方案。

回答

1

如果可以,請嘗試將數據放入實例內存。如果它不適合實例內存,則有幾個選項可供您使用。

您可以將數據存儲在您使用應用程序上傳的資源文件中(如果該應用程序只是偶爾更改並從磁盤訪問)。這假設你可以建立一個數據結構,允許簡單的磁盤查找 - 有效地,你正在實現你自己的基於只讀磁盤的表。同樣,如果它太大而不適合作爲靜態資源,則可以採取與上述相同的方法,但將數據存儲在Blobstore中。

如果您的數據絕對必須在數據存儲區中,則可能需要模擬您自己的讀取 - 修改 - 寫入事務。將'revision'屬性添加到記錄中。要對其進行修改,請取出記錄(在事務外部),執行所需的更改,然後在事務中取回記錄以檢查修訂值。如果尚未更改,請將您的記錄中的修訂版本增加到數據存儲區。

請注意,底層RPC層在理論上支持多個獨立事務(和非事務操作),但是API當前沒有公開任何方式從事務內部訪問它,缺乏可怕的(我的意思是真的可怕的)黑客。

最後一個選擇:您可以運行配置更多內存的後端,公開'SpellCheckService',並從您的前端對其進行URLFetch調用。請記住,內存總是比任何基於磁盤的選項快得多,速度更快。

+0

+1建議將它放入內存中。對於固定數據,這可能是最佳的。 – SingleNegationElimination

+0

關於您的第一個建議,我是否正確理解可以將表保存在數據存儲中,然後在開始我的事務之前將整個表讀入實例內存?這將工作,但表佔用​​3MB的東西,我只需要少量的表查找。因此,當我需要的是幾百字節時,我會以3MB讀取,這聽起來效率不高。或者你還在建議其他東西?實例內存無法繼續存在請求(除了寫入memcache)嗎? (並感謝您的回覆 - 在週日晚上不會少於!) – Dragonfly

+0

至於您的其他想法,我瞭解「修訂財產」的想法,並可以與此一起去。我還沒有了解blobstore或後端,所以我會研究下一步。我喜歡使用後端的聲音;這個解決方案有什麼缺點嗎?附:我仍然認爲GAE支持任何事務可以訪問的不可變數據存儲實體是一個好主意! – Dragonfly

1

首先,如果您認爲命名空間將有助於避免重大沖突,那麼現在是時候退一步了。密鑰由實體種類,名稱空間,名稱或ID以及實體可能具有的任何父母組成。對於兩種不同的實體類型來說,它們具有相同的名稱或ID是完全有效的。因此,如果您有與之匹配的LookupThingy,並且已通過指定唯一名稱創建了每個成員,則該關鍵字不會與其他任何成員發生衝突。

對於在事務內對未查詢的查找表進行等價拼寫檢查的挑戰,是否可以將查找表保存在代碼中?

或者你能想到一個比較接近你需要的比喻嗎?激勵需要在交易中進行查找的動機之一?

+0

是的,您必須是正確的,單獨的名稱空間不會添加任何保護。我曾認爲這可能會避免重大沖突,但即使在默認名稱空間內,也應該充分做到這一點。 另一個例子:假設您想將數據與每個郵政編碼相關聯;例如,您可能擁有平均收入數據或其他人口統計數據。您將如何從交易內部諮詢此表?這似乎是一個非常普遍的問題。 硬編碼到Python代碼中的一百萬個條目?我想這會起作用,但它看起來很糟糕。這是唯一的解決方案嗎? – Dragonfly

+0

爲什麼匹配查找表必須通過事務完成?您是否試圖隔離查找表的偶發更改? –

+0

這裏沒有足夠的空間來充分解釋事務的需要,但它與查找表無關。這是通常的原因:我正在對實體組進行更改,並且數據必須以原子方式處理。我嘗試用Python表示所有表格數據,並且這超出了代碼允許的空間量(「軟處理大小限制」)。我想這是可以預料的。這個問題仍然沒有答案。 – Dragonfly