我有一堆 N 字节块中的二进制数据,其中每个块完全对应于 PyTables 表的一行。
现在我正在将每个块解析为字段,将它们写入表行中的各个字段,然后将它们附加到表中。
但这似乎有点愚蠢,因为 PyTables 会将我的结构化数据转换回平面二进制形式以包含在 HDF5 文件中。
如果我需要优化执行此操作所需的 CPU 时间(我的数据大量爆发),是否有更有效的方法将数据直接加载到 PyTables 中?
我有一堆 N 字节块中的二进制数据,其中每个块完全对应于 PyTables 表的一行。
现在我正在将每个块解析为字段,将它们写入表行中的各个字段,然后将它们附加到表中。
但这似乎有点愚蠢,因为 PyTables 会将我的结构化数据转换回平面二进制形式以包含在 HDF5 文件中。
如果我需要优化执行此操作所需的 CPU 时间(我的数据大量爆发),是否有更有效的方法将数据直接加载到 PyTables 中?
PyTables 目前没有像您描述的那样公开“原始”转储机制。但是,您可以使用 UInt8Atom 和 UInt8Col 伪造它。你会做这样的事情:
import tables as tb
f = tb.open_file('my_file.h5', 'w')
mytable = f.create_table('/', 'mytable', {'mycol': tb.UInt8Col(shape=(N,))})
mytable.append(myrow)
f.close()
这可能会让您获得最快的 I/O 性能。但是,您将错过作为此二进制块一部分的各个字段的含义。
可以说,块/行的原始转储无论如何都不是您想要做的,这就是为什么不明确支持它的原因。HDF5 和 PyTables 在内部为您处理多种转换。这包括但不限于字节顺序和平台特定功能。通过为您管理数据类型,生成的 HDF5 文件和数据集跨平台。当您以您描述的方式转储原始字节时,您会短路使用 HDF5/PyTables 的主要优势之一。如果您进行短路,则生成的文件很可能在生成它的原始系统之外的任何东西上看起来都像垃圾。
所以总而言之,您应该将块转换为内存中的适当数据类型,然后写出。是的,这需要更多的处理能力、时间等。所以除了做正确的事情之外,它最终会为你省去很多麻烦。