python上的快速文件加载

python上的快速文件加载,python,loading,pickle,Python,Loading,Pickle,在python上加载数据有两个问题,两个scipt都可以正常工作,但是它们需要太多的时间来运行,有时会导致“死机”(第一个) 我有一个大的压缩文本文件,我会这样做: 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.d

在python上加载数据有两个问题,两个scipt都可以正常工作,但是它们需要太多的时间来运行,有时会导致“死机”(第一个)

  • 我有一个大的压缩文本文件,我会这样做:

    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()
    
  • 我必须对在上一个脚本中创建的字典执行一些操作

    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的数据…

    如果您正在处理的数据是原始的和简单的,那么您可以尝试
    封送
    模块:。这就是Python用来序列化字节码的方法,因此速度非常快。

    第一条注释,在:

    with open("data_dict.pkl", "rb") as f:
            tab = pickle.load(f)
    f.close()
    
    f.close()
    不是必需的,上下文管理器(
    使用
    语法)会自动执行该操作

    至于速度,我不认为你会比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
    

    Pickle很慢,而且很不安全。但您至少应该添加使用最快pickle协议的提示(请参阅文档):pickle.HIGHEST_protocol作为转储的第三个参数。根据你的实际工作,有很多其他的选择来加快速度。(例如,使用sqlite db)。问题是您正在将所有内容加载到内存中,而不是流式处理?如果是这样的话,您可能想查看streamingpickle()。