我正在处理最多有几十亿行的表格,并且我使用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]
但是,迭代器必须知道自己的大小,而列表理解已经耗尽,所以肯定有办法将它们组合在一起。我找不到合适的方式。
顺便说一下。我还尝试使用zip
和range
强制StopIteration
:
[row['bar'] for for _, row in zip(range(10000), table.where('(foo == 234)'))]
但这给了我同一行的重复数字。
答案 0 :(得分:1)
由于它是可迭代的并且似乎按需生成行,因此您应该能够使用itertools.islice
来加快速度。
rows = list(itertools.islice(table.where('(foo == 234)'), 10000))