首页 > 解决方案 > 如何创建一个 PyTables 表来存储一个巨大的方阵?

问题描述

我正在尝试创建一个 PyTables 表以在其中存储 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

我在这里做错了什么?

标签: python-3.xpytables

解决方案


那是一个大矩阵(如果所有整数都为 300GB)。可能您将不得不逐步编写。(我的系统上没有足够的 RAM 来一次性完成所有操作。)

如果没有看到您的数据类型,很难给出具体的建议。
第一个问题:你真的想创建一个还是一个数组就足够了?PyTables 有这两种类型。有什么不同?数组保存同质数据(如 NumPy ndarray)并且可以具有任何维度
通常用于保存异构数据(如 NumPy 重新数组)并且始终是二维的(实际上是结构化类型的一维数组)。表还支持使用 PyTables API 进行复杂查询。

创建时的关键是使用description=orobj=参数来描述每行的结构化类型(和字段名称)。我最近发布了一个答案,展示了如何创建表格。请查阅。您可能会发现您不想创建 200000 个字段/列来定义表格。请参阅此答案:数组的不同列的不同数据类型

如果您只想保存 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()

推荐阅读