2012-06-13 36 views
3

我是Python新手,現在已經學習了3個月的學習內容,學習類型,函數和算法。現在我開始使用GAE框架實踐Web應用程序開發。python:如何讓所有的應用程序都可以訪問的字典

目標:有一個非常大的字典,可以從整個Web應用程序中的所有.py文件進行訪問,而不必存儲多次或每次有人訪問應用程序的URL時重新創建。

我想呈現一個簡單的數據庫表到字典,希望速度增益,因爲它將在內存中。

而且我刨在內存DAWG創建 - TRIE

我不希望這個字典中每一個頁面被調用時創建的,我希望它是存儲在內存中一次,保持那裏,由所有會話使用和訪問,如果可能的話也進行修改。

我該如何做到這一點?就像一個簡單的內存數據庫,但實際上是一個Python字典?

謝謝。

回答

0

我會刺激這個,並提出標準的python shelve模塊。這提供了一個由dbm文件支持的簡單持久字典。

有幾個注意事項特別涉及到併發。如果回寫已啓用,它確實提供了一些緩存,但同樣可能存在有關內存消耗的問題。另一個限制是鍵必須是字符串。

不過,它可能值得一看。它絕對符合「純Python黑客」的描述。

簡單的例子:

import shelve 

d = shelve.open('my_shelf') 
for i in range(100000): 
    d[str(i)] = 'Item %s' % i 
d.close() 
d = shelve.open('my_shelf') 
>>> d['50000'] 
'Item 50000' 
+1

你不能寫入App Engine上的文件系統,所以這是行不通的。 – geoffspear

+0

你好,謝謝!這雖然不適合GAE(我可能會使用memcache或redis),這是我想知道的,我相信!我剛剛閱讀擱置的文檔。如果我想存儲的不是字符串,而是對象,我應該使用哪種類型的文件,如果不是隻有字符串的dbm? – Phil

+0

您可以存儲對象。這只是需要字符串的關鍵。內部擱置將存儲醃漬物品,但您無需擔心這一點。 – mhawke

-2

這是不可能的(沒有外部服務)。數據庫用於存儲比一個請求更長的數據。你可以做的是在用戶會話中安全使用字典,但我不建議這樣做。除非你有數以百萬計的條目,否則每個數據庫即使是sqlite也足夠快。

+1

有可能保持在內存中會超越請求的東西,你爲什麼會聲稱並非如此? –

+0

不是。不在嚴重的Web服務器上,這些Web服務器可能會阻止線程並在新的請求中啓動新的線程。 – dav1d

+0

這是:想到'memcached'或其他服務運行在不同的端口上。您可以簡單地訪問這些服務,而是將數據保存在內存中。 –

7

使用memcache。您可以將醃字典存儲在memcache中,但也可以直接將鍵/值存儲在memcache中。編寫一個包裝類,確保從數據存儲中加載值(如果它們不在memcache中)。

甚至更​​好,只需使用ndb,它會自動爲memcache中的值緩存值。這樣,您只需查詢數據存儲中的值,ndb將自動將這些值緩存在內存中(跨多個請求)。

+0

+1:但持久性呢? OP _kind of_暗示可能性爲 – mhawke

+0

你好!非常感謝您的意見。我看着ndb,然而這意味着我將自己鎖定在GAE之外,這是我不想要的。我現在正在將它們用於實踐目的,以獲得更好的Python知識。我還研究了redis和memcache,看起來好像兩者都是解決方案,但我更喜歡這裏的純Python黑客。 – Phil

+0

沒有外部服務的純Python是不可能的... – dav1d

相關問題