如何创建一个 PyTables table 来存储一个巨大的方阵?

How to create a PyTables table to store a huge square matrix?

我正在尝试创建一个 PyTables table 以在其中存储 200000 * 200000 矩阵。 我试试这个代码:

import tables
columns = {}
for x in range (200000):
    columns['col' + str(x)] = tables.FloatCol()
h5f = tables.open_file('matrix1.h5', 'w')
tbl = h5f.create_table('/', 'matrix', columns)
h5f.close()

,但由于此回溯而失败:

  File "/home/nick/tests0/reg/create_tables.py", line 18, in <module>
    tbl = h5f.create_table('/', 'matrix', columns)

  File "/home/nick/anaconda3/lib/python3.8/site-packages/tables/file.py", line 1053, in create_table
    ptobj = Table(parentnode, name,

  File "/home/nick/anaconda3/lib/python3.8/site-packages/tables/table.py", line 835, in __init__
    super(Table, self).__init__(parentnode, name, new, filters,

  File "/home/nick/anaconda3/lib/python3.8/site-packages/tables/leaf.py", line 286, in __init__
    super(Leaf, self).__init__(parentnode, name, _log)

  File "/home/nick/anaconda3/lib/python3.8/site-packages/tables/node.py", line 264, in __init__
    self._v_objectid = self._g_create()

  File "/home/nick/anaconda3/lib/python3.8/site-packages/tables/table.py", line 1022, in _g_create
    self._v_objectid = self._create_table(

  File "tables/tableextension.pyx", line 211, in tables.tableextension.Table._create_table

HDF5ExtError: Problems creating the table

我做错了什么?

这是一个很大的矩阵(如果全是整数,则为 300GB)。可能您将不得不逐步编写。 (我的系统上没有足够的 RAM 来同时完成这一切。)

没有看到你的数据类型,很难给出具体的建议。
第一个问题:你真的想创建一个 Table 还是 Array 就足够了? PyTables 有两种类型。有什么区别?
Array 包含同类数据(如 NumPy ndarray)并且可以具有任何维度。 Table 通常用于保存异构数据(如 NumPy recarray)并且始终是二维的(实际上是 结构化 的一维数组类型)。 Tables 还支持使用 PyTables API.

的复杂查询

创建 Table 的关键是使用 description=obj= 参数来描述结构化类型(和字段每行的名称)。我最近发布了一个答案,展示了如何创建 Table。请查阅。您可能会发现您不想创建 200000 fields/columns 来定义 Table。看到这个答案:

如果您只想保存 200000x200000 个同质实体的矩阵,数组更容易。 (考虑到数据大小,您可能需要使用 EArray,因此您可以增量写入数据。)我写了一个简单的示例,它创建了一个包含 2000x200000 个实体的 EArray,然后再添加 3 组数据(每组 2000 行;总计8000 行)。

  • shape=(0,nrows)参数表示第一个轴可以 扩展,并创建 ncols 列。
  • expectedrows=nrows 参数在大型数据集中很重要 即兴 I/O 表演。

生成的 HDF5 文件为 6GB。重复 earr.append(arr) 99 次得到 200000 行。代码如下:

import tables as tb
import numpy as np

nrows=200000
ncols=200000
arr = np.arange(2000*ncols).reshape(2000,ncols)
h5f = tb.File('matrix1.h5', 'w')
earr = h5f.create_earray('/', 'myarray', shape=(0,ncols), expectedrows=nrows, obj=arr)
earr.append(arr)
earr.append(arr)
earr.append(arr)

h5f.close()