我在python上加载数据时遇到两个问题,两个scipts都正常工作但是它们需要太多时间才能运行,有时“杀死”就是结果(第一个)。
我有一个大的压缩文本文件,我这样做:
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的那些......
答案 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