在python上快速加载文件

时间:2013-11-20 21:37:21

标签: python loading pickle

我在python上加载数据时遇到两个问题,两个scipts都正常工作但是它们需要太多时间才能运行,有时“杀死”就是结果(第一个)。

  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)
    
  3. 你有其他解决方案吗?也许不是涉及YAML或JSON的那些......

2 个答案:

答案 0 :(得分:1)

如果您正在挑选的数据是原始且简单的,您可以尝试marshal模块:http://docs.python.org/3/library/marshal.html#module-marshal。这就是Python用来序列化其字节码的东西,因此它非常快。

答案 1 :(得分:0)

第一条评论,在:

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

f.close()不是必需的,上下文管理器(with语法)会自动执行此操作。

就速度而言,我认为你不会比cPickle快得多,以便直接从磁盘读取某些东西作为Python对象。如果需要反复运行此脚本,我会尝试通过memchached使用pylibmc来保持对象永久存储在内存中,以便您可以快速访问它:

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