当结果很大时,使用index的搜索比pytables中没有索引的搜索要慢

时间:2013-12-25 06:37:52

标签: python indexing hdf5 pytables

以下代码创建测试hdf5文件:

from tables import *

class KeyValue(IsDescription):
    key = StringCol(itemsize=30, dflt=" ", pos=0)  # character String
    value = Int64Col(dflt=0, pos=1)

f = open_file("keyvalue.h5", "w")    
kv = f.create_table("/", "keyvalues", KeyValue)

import string
import random

for j in range(20):
    values = []
    for i in xrange(100000):
        key = "".join(random.sample(string.uppercase, 5))
        value = random.randint(0, 1000000)
        values.append((key, value))
    kv.append(values)

f.close()

以下是速度测试代码:

f = open_file("keyvalue.h5", "a")
kv = f.root.keyvalues

kv.cols.value.remove_index()

print "without index"
%timeit a = kv.read_where('value < 10')
%timeit a = kv.read_where('value < 1000')

kv.cols.value.create_csindex()

print "with index"
%timeit a = kv.read_where('value < 10')
%timeit a = kv.read_where('value < 1000')

f.close()

输出是:

without index
10 loops, best of 3: 66.1 ms per loop
10 loops, best of 3: 109 ms per loop
with index
10000 loops, best of 3: 164 µs per loop
10 loops, best of 3: 121 ms per loop

当查询'value&lt; 10',使用索引搜索比没有索引快得多,但是 当查询'值&lt; 1000',它比没有索引慢。

我想知道这怎么可能发生,你可以将timeit结果发布到你的身上吗? 机?

2 个答案:

答案 0 :(得分:1)

所以这很可能发生,因为当您查询的总数据集只有一小部分时,索引效果最好。在您提供第一个查询value < 10的示例中,满足此约束并且查询速度更快。第二个查询value < 1000刚好超过了这个约束的尖端,因此头发变慢了。 “小”的含义可能取决于您的数据集。因此,有必要获取一些时间信息来帮助您做出决策。

正如您在this notebook that I made中看到的那样,随着您增加值范围的子集,查询变得越来越慢。对于您的特定操作(少于一个数字),当然可以对不适用于其他类型索引的索引进行优化。现在存在的索引处理更广泛的用例和查询。可能值得在pytables-dev邮件列表中提出这个问题。

更新:

时间图: enter image description here

答案 1 :(得分:1)

我遇到了同样的问题,我认为这与我创建的这个问题有关:

https://github.com/PyTables/PyTables/issues/187

https://groups.google.com/d/msg/pytables-users/oQIO2hJdB6U/Oo3iDNlmN1sJ