以下代码创建测试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
结果发布到你的身上吗?
机?
答案 0 :(得分:1)
所以这很可能发生,因为当您查询的总数据集只有一小部分时,索引效果最好。在您提供第一个查询value < 10
的示例中,满足此约束并且查询速度更快。第二个查询value < 1000
刚好超过了这个约束的尖端,因此头发变慢了。 “小”的含义可能取决于您的数据集。因此,有必要获取一些时间信息来帮助您做出决策。
正如您在this notebook that I made中看到的那样,随着您增加值范围的子集,查询变得越来越慢。对于您的特定操作(少于一个数字),当然可以对不适用于其他类型索引的索引进行优化。现在存在的索引处理更广泛的用例和查询。可能值得在pytables-dev邮件列表中提出这个问题。
更新:
时间图:
答案 1 :(得分:1)