python上的快速文件加载
在python上加载数据有两个问题,两个scipt都可以正常工作,但是它们需要太多的时间来运行,有时会导致“死机”(第一个)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
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()。