【问题标题】:How do I initialize a PyTables table column size?如何初始化 PyTables 表的列大小?
【发布时间】: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


    【解决方案1】:

    这并不能完全回答我自己的问题,但在解决另一个问题时,我找到了一个解决方案。如上所述,我将可变长度向量保存为单独的数组,而不是保存在表格中,如described 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")
    
        def end_of_trajectory(self, results):
            i = current_photon
            current_vector_name = "vector%2" % i
            current_vector = self.h5.create_array(self.traj_group, current_vector_name, results.layer)
            current_vector.attrs.start = results.start
            current_vector.attrs.end = results.end
            trajectory.flush()
    
        def end_of_run(self):
            self.h5.close()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-03
      • 1970-01-01
      • 2018-02-26
      • 1970-01-01
      • 2019-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多