【发布时间】:2015-02-08 09:13:01
【问题描述】:
我正在进行蒙特卡洛计算,我想将中间结果保存到磁盘。下面是我的代码的基本版本。在我的原始版本中,我有一个数据聚合器对象,它会收集每个轨迹的结果,然后在最后计算一些统计数据并写入磁盘,但我开始耗尽内存并且文件很笨重。我正在尝试使用 PyTables,以便我可以 a) 将数据刷新到磁盘并 b) 在完成后有效地将其读回以进行进一步处理。我在this tutorial 工作。我的问题是,对于每次运行,将进入 layer 列的数据是一个 1xn 向量,其中 n 在脚本的开头设置(它实际上是在现实生活中的命令行上传递的 em>)。
Python 不允许我在聚合器类中定义表描述符类,但 n 的大小超出了描述符类的范围。我来自 MATLAB 背景,所有的表创建和刷新到磁盘都隐藏在单个 matfile 命令后面,所以我真的迷路了。
我应该如何正确初始化我的数据表,以便它可以在聚合器对象中看到?如果我应该以不同的方式执行此操作,我怎样才能对我已经工作的(写入磁盘除外)代码造成最少的损害?
import tables
import numpy
class Trajectory(tables.IsDescription):
start = tables.Float32Col(shape=(1, 2))
end = tables.Float32Col(shape=(1, 2))
layer = tables.Float32Col(shape=(1, n)) # how do I pass n to here?
class AggregateResults(object):
def __init__(self, n, filename):
self.n = n
self.h5 = tables.openFile(filename, mode="w")
self.traj_group = self.h5.createGroup(self.h5.root, "Trajectories")
self.traj_table = self.h5.createTable(self.traj_group, "trajectory", Trajectory, "Single Trajectory)
def end_of_trajectory(self, results):
trajectory = self.traj_table.row
trajectory['start'] = results.start_position
trajectory['end'] = results.end_position
trajectory['layer'] = results.layer_path
trajectory.append()
trajectory.flush()
def end_of_run(self):
self.h5.close()
def do_code(aggregate):
results = # long calculation goes here
aggregate.end_of_trajectory(results)
main():
filename = "filename.h5"
n = 7
aggregate = AggregateResults(n, filename)
for x in range(100000):
do_code(aggregate)
aggregate.end_of_run()
【问题讨论】:
标签: python-3.x pytables