python-3.x - 如何创建一个 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
我在这里做错了什么?
解决方案
那是一个大矩阵(如果所有整数都为 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()
推荐阅读
- apache-zeppelin - Zeppelin 更改端口未更新
- javascript - Zoho Mail API 授权令牌问题
- c++ - 构建库 matio 时,configure 脚本抛出错误“C 编译器无法创建可执行文件”
- bash - 多个 grep 和分组输出
- python - 来自外键的字段未在 django admin 中显示数据
- javascript - 如何在每 n 个字符处或最近的前一个空格处拆分字符串
- python-3.x - 如何从不和谐的网络块嵌入中获取文本
- java - Android Studio:编译时错误:原因:org/apache/commons/io/FileUtils
- qt - 将 Qt 中的 .pro 行转换为 cmake 行
- javascript - 查找和更新子文档,如果不存在则创建新的