2013-11-20 117 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