我正在寻找最节省内存的方法来组合读取 Pytables 表(列:x,y,z)以排序顺序(z 列具有 CSI)并评估类似的表达式
x+a*y+b*z
其中 a 和 b 是常数。到目前为止,我唯一的解决方案是使用“sortyby=z”标志复制整个表,然后在表上逐段计算表达式。
注意:我想将结果 x+a*y+b*z 保留在内存中,以便对其进行一些在 Pytables 中无法直接使用的归约操作,然后将其保存到新的 Pytables 表中。
有两个基本选项,具体取决于您是否需要以排序方式进行迭代。
如果您需要遍历排序表中的表,那么读入将比计算表达式昂贵得多。因此,您应该使用Table.read_sorted()有效地阅读并在列表理解或类似中计算此表达式:
a = [row['x']+a*row['y']+b*row['z'] for row in
tab.read_sorted('z', checkCSI=True)]
如果您不需要以排序方式进行迭代(看起来不像您这样做),您应该使用Expr 类设置和评估表达式,从 column 读取 CSI,并将其应用于表达式结果。这看起来像:
x = tab.cols.x
y = tab.cols.y
z = tab.cols.z
expr = tb.Expr('x+a*y+b*z')
unsorted_res = expr.eval()
idx = z.read_indices()
sorted_res = unsored_res[idx]