2014-06-08 45 views
2

我的代碼中有幾個巨大的屬性,每個大約需要4 MB。當我在Eclipse中啓動應用程序時,程序必須從文件加載所有這些屬性。大約需要30秒。有沒有辦法在內存中保存這些屬性,所以我每次運行該程序時都不需要等待30秒?Python:關閉程序後在內存中保存數據

我認爲這將有可能在C使用指針。

感謝您的建議

+2

你有關memcached嗎?有一個Python實現:https://pypi.python.org/pypi/python-memcached/當然,你也必須設置一個memcache服務器。 –

回答

1

你不能使用C指針來做到這一點。當程序存在時,所有分配的內存被釋放。以及其他資源,如打開文件和數據庫連接。

你可以做的是設置一些內存緩存服務器。您可以像John Barca建議的那樣使用memcached,我個人使用Redis http://redis.io/來處理這些事情。

但是請記住,memcached和redis只會幫助文件讀取時間。你有多少個4mb屬性?在現代計算機上加載4mb文件應該是瞬間的。可能你的程序花費時間解析從文件中讀取的屬性,在這種情況下,你最好使用類似pickle的東西來保存和加載對象。你的程序中應該有一些邏輯來比較你的酸洗文件和原始數據文件的時間戳,並從適當的源代碼中加載。

+0

謝謝你的建議。是的,我用泡菜。例如:def fileReadDictionaryInMemory(): 打開inspect.stack()[0] [3] with open(「dictionaryinMemory.txt」,'rb')爲f: dictionary = pickle.load(f) 返回詞典「需要4.9秒。該文件需要8 MB。這是我如何保存它:'用open(「dictionaryInMemory.txt」,'wb')作爲f: pickle.dump(dictionaryMemory,f)'這是正常的?我的機器:Intel Core 2 Duo - 2 GHz - 3 GB –

1

這是一個簡單的解決方案。有一個外部進程保存昂貴的資源並導入可以使用該資源的模塊。可以更改模塊代碼,然後在外部進程繼續運行時重新加載,並繼續保持昂貴的資源。

main.py

# importlib for python 3, not needed for 2 
#import importlib 
expensive_data = [1, 2, 3, 4] 

# need to import successfully before using importlib.reload() 
import usedata 
while(True): 
    raw_input("waiting") 
    # use this for python 3 
    #importlib.reload(usedata) 
    # and this for python 2 
    reload(usedata) 
    usedata.func(expensive_data) 

usedata.py

def func(data): 
    print [i+2 for i in data] 

#def func(data): 
# print [i+3 for i in data] 

作爲試驗就可以開始main.py和通過改變功能開關,其被在usedata.py使用的功能被註釋。

相關問題