如何创建一个 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()
我正在尝试创建一个 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()