限制pytables中`.where(...)`返回的行数

时间:2016-09-22 07:03:19

标签: pytables

我正在处理最多有几十亿行的表格,并且我使用where(numexpr_condition)进行了大量“pytables”查找。

我们设法优化了HDF5格式,因此在20秒内完成了600多个行的简单查询(我们仍在努力寻找如何加快速度,但这是另一个故事)。

但是,由于它仍然太慢而不能玩,我需要一种方法来限制查询中的结果数量,就像这个简单的例子一样(foo列当然是索引的):

[row['bar'] for row in table.where('(foo == 234)')]

所以这将返回让我们说100个条目,它需要18秒,这是原型制作和玩游戏的方法。

您如何将结果限制为10000?

数据库就像等效查询一样:

SELECT bar FROM row WHERE foo==234 LIMIT 10000

使用stop=属性不是方法,因为它只需要第一个n行并将条件应用于它们。所以在最坏的情况下,如果条件没有满足,我得到一个空数组:

[row['bar'] for row in table.where('(foo == 234)', stop=10000)]

在列表推导上使用切片也不是正确的方法,因为它将首先创建整个数组,然后应用切片,当然这根本没有速度增益:

[row['bar'] for row in table.where('(foo == 234)')][:10000]

但是,迭代器必须知道自己的大小,而列表理解已经耗尽,所以肯定有办法将它们组合在一起。我找不到合适的方式。

顺便说一下。我还尝试使用ziprange强制StopIteration

[row['bar'] for for _, row in zip(range(10000), table.where('(foo == 234)'))]

但这给了我同一行的重复数字。

1 个答案:

答案 0 :(得分:1)

由于它是可迭代的并且似乎按需生成行,因此您应该能够使用itertools.islice来加快速度。

rows = list(itertools.islice(table.where('(foo == 234)'), 10000))