Python 使用PyTables索引500 GB HDF5文件

Python 使用PyTables索引500 GB HDF5文件,python,hdf5,pytables,h5py,bigdata,Python,Hdf5,Pytables,H5py,Bigdata,我想将一个键控500GB-800GB的表转储到HDF5中,然后检索与特定键匹配的行 对于HDF5文件,像所有数据访问这样的项都使用一个整数“行”数,因此似乎我必须在HDF5之外实现一个“键到行数映射” 这行吗?我需要访问整个HDF5“内存(RAM)”吗 有人能告诉我HDF5在这种情况下的性能有多差吗?如果有合适的索引,这只是一个巨大的字典,对吗 我应该使用其他记录类型吗?假设您已经在PyTables中定义了此记录类型 class Record(tables.IsDescription):

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

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

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

有人能告诉我HDF5在这种情况下的性能有多差吗?如果有合适的索引,这只是一个巨大的字典,对吗


我应该使用其他记录类型吗?

假设您已经在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)]
但请注意,索引不会在所有条件下使用(请参阅下面的参考资料)。要检查查询是否正确使用索引,可以使用该方法


来源:

假设您已在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)]
但请注意,索引不会在所有条件下使用(请参阅下面的参考资料)。要检查查询是否正确使用索引,可以使用该方法


来源:

PyTables支持列上的索引(请参阅。将
numexpr
与OPSI索引一起使用应该足够快,并且不需要将所有内容都读入内存@Ümit,谢谢。这实际上是一个非常好的主意。您能提供一个下面的快速示例吗?例如,制作表,将OSPI索引放在一个装满Pytable的列的手上,使用numexpr来演示如何实现这一点,等等。)。它更容易理解,并且对于StackExchangePyTables非常有用,因为它支持列上的索引(请参阅。将
numexpr
与OPSI索引一起使用应该足够快,并且不需要将所有内容都读入内存@Ümit,谢谢。这实际上是一个非常好的主意。您能提供一个下面的快速示例吗?例如,制作表,将OSPI索引放在一个装满Pytable的列的手上,使用numexpr来演示如何实现这一点,等等。)。它更容易理解,对StackExchange也很有用“使用压缩(即BLOSC、LZF等)会给您带来轻微的速度提升,因为解压缩的CPU开销小于i/O开销(因此,对不适合内存的大型表使用压缩)。“我不确定我是否遵循了这一点。500 GB无法装入RAM。BLOSC和LZF之间在性能上是否有差异?您能否在上面概述一下如何使用数据压缩?(对不起,只需要更多细节,以使文章更全面。谢谢!)另外,BLOSC和LZF有什么区别吗?谢谢你的帮助!问题:如果你的查询不是“顺序”的,而是随机访问,那该怎么办?这个方案仍然有效吗?也就是说,想象一下,如果你的查询需要访问多个块。这仍然可行吗?随机访问实际上在使用块(压缩)时效果更好布局优于连续布局您能解释一下吗?即使查询需要访问多个卡盘?这是因为使用连续布局,随机访问查询需要使用压缩(即BLOSC、LZF等)访问整个数据集由于解压缩的CPU开销小于I/O开销(因此,对不适合内存的大型表使用压缩)。“我不确定我是否遵循这一点。500 GB不适合RAM。BLOSC和LZF之间在性能上是否存在差异?您能否概述一下如何使用数据压缩?(对不起,只需要更多的细节就可以使文章更全面。谢谢!)另外,BLOSC和LZF有什么区别吗?谢谢你的帮助!问题:如果你的问题不是“顺序”的怎么办但是随机访问?这个方案仍然有效吗?也就是说,想象一下如果你的查询需要访问几个块。这仍然可行吗?事实上,随机访问在使用块(压缩)时效果更好布局优于连续布局您能解释一下吗?即使查询需要访问多个卡盘?这是因为使用连续布局时,随机访问查询需要访问整个数据集?
indexrows = table.cols.row.create_index()