我正在进行一个需要多次迭代的数值实验。每次迭代之后,我希望将数据存储在pickle文件或pickle类文件中,以防程序超时或数据结构被攻丝。最好的方法是什么。以下是骨架代码:
data_dict = {} # maybe a dictionary is not the best choice
for j in parameters: # j = (alpha, beta, gamma) and cycle through
for k in number_of_experiments: # lots of experiments (10^4)
file = open('storage.pkl', 'ab')
data = experiment() # experiment returns some numerical value
# experiment takes ~ 1 seconds, but increase
# as parameters scale
data_dict.setdefault(j, []).append(data)
pickle.dump(data_dict, file)
file.close()
问题:
谢谢你的帮助!在
numpy
,而不是{a1},我建议使用numpy.savez。在我会用}。在
collections.defaultdict(list)
代替普通的dict
和{不过,搁架可能不是个好选择。。。在
您可以尝试使用
klepto
或joblib
。两者都擅长缓存结果,并且可以使用高效的存储格式。在joblib
和{numpy
内部存储格式和/或保存时的压缩…还可以根据需要保存到内存映射文件。在如果使用}或其他一些存储格式。在
klepto
,它将字典键作为文件名,并将值保存为内容。使用klepto
,您还可以选择使用pickle
还是{这将创建一个名为}),以决定将哪些键从内存中清除并转储到磁盘。在
storage
的目录,其中包含pickled文件,data_dict
的每个键对应一个。有一些关键字用于使用memmap
文件,也有用于压缩级别的关键字。如果您选择cached=False
,那么每次写入data_dict
时,您将不再转储到文件,而是每次写入内存……然后您可以使用data_dict.dump()
在您选择时转储到磁盘……或者您可以选择一个内存限制,当您命中它时,您将转储到磁盘。此外,您还可以选择一种缓存策略(如lru
或{获取
klepto
此处:https://github.com/uqfoundation或者在这里得到
joblib
:https://github.com/joblib/joblib如果您重构,您可能会想出一种方法来实现这一点,这样它就可以利用预先分配的数组。但是,这可能取决于代码如何运行的概要文件。在
打开和关闭文件会影响运行时吗?对。如果使用
klepto
,则可以设置要转储到磁盘的粒度。然后,您可以在速度和结果的中间存储之间进行权衡。在相关问题 更多 >
编程相关推荐