【问题标题】:Using PyTables to index a 500 GB HDF5 file使用 PyTables 索引 500 GB HDF5 文件
【发布时间】:2016-11-12 09:41:44
【问题描述】:

我想将一个带键的 500GB-800GB 表转储到 HDF5 中,然后检索与特定键匹配的行。

对于 HDF5 文件,像所有数据访问这样的项目都使用整数“行”号,所以似乎我必须在 HDF5 之外实现“行号映射键”。

这行得通吗?我是否需要访问整个 HDF5“内存 (RAM)”?

谁能告诉我在这种情况下 HDF5 的表现会有多差?如果有不错的索引,这只是一本巨大的字典,对吧?

我应该使用其他东西吗?

【问题讨论】:

  • PyTables 支持列索引(请参阅here。将numexpr 与 OPSI 索引一起使用应该足够快,并且不需要将所有内容读入内存
  • @Ümit 谢谢你。这实际上是一个非常棒的主意。你能在下面提供一个简单的例子吗?例如制作表格,使用 PyTables 将 OSPI 索引放在一堆列上,使用 numexpr 显示这是如何完成的,等等。它更容易理解,并且对 StackExchange 很有用

标签: python hdf5 pytables h5py bigdata


【解决方案1】:

假设你已经在 PyTables 中定义了这个记录类型

class Record(tables.IsDescription):
    row = tables.Int32Col()
    col1 = tables.Int32Col()
    col2 = tables.Float64Col()
    col3 = tables.Float64Col()

常规范围查询可能如下所示:

result = [rec for rec in table if (rec['row'] > 100 and rec['row'] < 200)]

这很好,你的桌子不太大。但是对于大型表,它会相对较慢,因为必须将每一行带入 Python 空间以针对范围条件进行评估。

为了加速这个查询,可以依赖所谓的in-kernel查询,它允许在@987654321 的帮助下使用用C 编写的PyTables 内核检查条件@ 图书馆。

result = [rec for rec in table.where(
            'row > 100 & row < 200')]

您还可以将常规查询与内核查询混合匹配:

result = [rec for rec in table.where(
            'row > 100 & row < 200')] if your_function(rec['col2']) ]

如果您有不适合内存的大型表,则加速大约是 2 倍。使用压缩(即 BLOSC、LZF 等)会给您带来轻微的速度提升,因为解压缩的 CPU 开销小于 I/O 开销(因此对不适合内存的大表使用压缩)。

当您使用压缩时,数据集将被分割成块,并且块被单独压缩。这意味着如果您查询特定范围(第 100 - 200 行),则相应的压缩块将从磁盘加载到内存中,然后由 CPU 在内存中解压缩。与不使用压缩或连续存储数据集相比,这将加快速度。 Blosc 是一个元压缩器,lzf 是 h5py 的默认压缩器。有关Blosclzf 之间的区别,请参阅此thread

如果内核查询速度不够快,您还可以在一列或多列上创建索引。这样,查询将使用二进制搜索而不是顺序扫描。要在现有表上为 row 列创建索引,只需运行:

indexrows = table.cols.row.create_index()

但请注意,索引不会在所有条件下都使用(请参阅下面的参考资料)。要检查您的查询是否正确使用索引,您可以使用Table.will_query_use_indexing() 方法。

来源:http://www.pytables.org/usersguide/optimization.html#indexed-searches

【讨论】:

  • " 使用压缩(即 BLOSC、LZF 等)会给你带来轻微的速度提升,因为解压缩的 CPU 开销小于 I/O 开销(所以对不压缩的大表使用压缩) t适合记忆)。”我不确定我是否遵循这一点。 500 GB 不适合 RAM。 BLOSC 和 LZF 的性能有区别吗?你能在上面勾勒出你是如何使用数据压缩的吗? (抱歉——需要更多细节才能使帖子更全面。谢谢!)
  • 另外,BLOSC 和 LZF 有区别吗?感谢您的帮助!
  • 问题:如果您的查询不是“顺序”而是随机访问怎么办?这个方案还有效吗?也就是说,想象一下您的查询是否需要访问多个块。这仍然可行吗?
  • 随机访问实际上在分块(压缩)布局上比在连续布局下效果更好
  • 你能解释一下吗?即使查询需要访问多个卡盘?这是因为对于连续布局,随机访问查询需要访问整个数据集?
猜你喜欢
  • 2011-12-21
  • 2015-10-10
  • 2015-11-22
  • 2011-05-20
  • 2021-03-27
  • 1970-01-01
  • 2013-03-06
  • 2021-09-25
  • 2013-08-27
相关资源
最近更新 更多