2013-11-20 173 views
2

我有兩個問題與加載數據的Python,兩個工作正常,但他們需要太多的時間來運行,有時「殺」是結果(與第一個)。快速文件加載python

  1. 我有一個很大的壓縮文本文件,我做這樣的事情:

    import gzip 
    import cPickle as pickle 
    
    f = gzip.open('filename.gz','r') 
    tab={} 
    
    for line in f: 
         #fill tab 
    
    with open("data_dict.pkl","wb") as g: 
         pickle.dump(tab,g) 
    
    f.close() 
    
  2. 我必須做我在以前的腳本創建的字典一些操作

    import cPickle as pickle 
    
    with open("data_dict.pkl", "rb") as f: 
         tab = pickle.load(f) 
    f.close() 
    
    #operations on tab (the dictionary) 
    

您是否有其他解決方案?也許不是那些涉及YAML或JSON的...

+0

醃汁很慢,可能很不安全。但是,您至少應該添加提示以使用最快的pickle協議(請參閱文檔):pickle.HIGHEST_PROTOCOL作爲轉儲的第三個參數。根據你真正做的事情,還有很多其他的選擇可以加快速度。 (例如,使用一個sqlite數據庫)。 – schlenk

+1

是否將所有內容加載到內存中而不是流式傳輸?如果是這樣,你可能想看看流媒體泡菜(https://code.google.com/p/streaming-pickle/)。 – user2141650

回答

0

首先一個評論,在:

with open("data_dict.pkl", "rb") as f: 
     tab = pickle.load(f) 
f.close() 

f.close()是沒有必要的,上下文管理器(with語法)做自動。

現在至於速度,我不認爲你會比cPickle快得多,以便直接作爲Python對象從磁盤讀取某些內容。如果此腳本需要被一遍又一遍地跑我會嘗試通過pylibmc使用memchached保持持久存儲在內存中的對象,所以你可以訪問它快如閃電:

import pylibmc 

mc = pylibmc.Client(["127.0.0.1"], binary=True,behaviors={"tcp_nodelay": True,"ketama": True}) 
d = range(10000)   ## some big object 
mc["some_key"] = d  ## save in memory 

然後將其保存後,一旦你可以訪問和修改即使在前一個程序執行完畢後,它仍然保留在內存中:

import pylibmc 
mc = pylibmc.Client(["127.0.0.1"], binary=True,behaviors={"tcp_nodelay": True,"ketama": True}) 
d = mc["some_key"]  ## load from memory 
d[0] = 'some other value' ## modify 
mc["some_key"] = d  ## save to memory again