我正在做一个关于搜索引擎的研究项目,我遇到了for循环的性能问题。我有以下问题:
for value in hash_array.keys():
cell= db_conn.use_client().hql_query(db_conn.use_namespace(),'SELECT doc_text FROM SE_doc_text WHERE ROW=\"'+
value+"\" SCAN_AND_FILTER_ROWS LIMIT 1").cells
list_result[value].append(cell[0].value)使用hypertable我想要有最好的性能,但是当我在hash_array.keys()的20.000或30.000个元素上使用它时,我得到了大约5-6分钟的结果,所以这很慢,真的很慢。有没有其他的方法来执行fast for?或者我应该在整个搜索引擎中使用我的b计划。
查询性能:
Elapsed time: 0.10 s
Avg value size: 1428.00 bytes
Avg key size: 57.00 bytes
Throughput: 595190.38 bytes/s
Total cells: 1
Throughput: 400.80 cells/s在硬件上测试:
8gb 1600mhz
1055t amd其他事实:
Without SCAN_AND_FILTER_ROWS: 1.78163504601ms
With SCAN_AND_FILTER_ROWS: 3.27163504601ms
Only for loop: 0.0630ms对于解决方案(来自答案),我有以下几点:
stringRow = ' AND '.join(["ROW = \""+value + "\"" for value in hash_array.keys()])
cell = db_conn.use_client().hql_query(db_conn.use_namespace(),stringBatch+stringRow).cells
Results: 0.355320930481ms for 2097 documents
1.0214779377 for 3565 documents这是好的,但不是最好的解决方案。
发布于 2012-05-25 15:15:20
我从来没有使用过Hypertable,但简单地阅读documentation就会发现SCAN_AND_FILTER_ROWS子句可能会有问题:
对于查询大量行间隔(例如10,000+)的情况,
这是一种显式优化。此选项将导致系统执行全表扫描并过滤结果以查找所需的行,而不是单独获取每个行间隔。请谨慎使用此选项,对于较少的行间隔数,此选项的效率可能非常低。
如果您一次发送多批密钥,此子句可能会变得更合适。
阅读更多documentation表明,使用以下结构可以进行批处理:
| '(' [row_key relop] ROW relop row_key
(OR [row_key relop] ROW relop row_key)* ')'因此,使用100个不同键的析取构造一个查询:ROW=x OR ROW=y OR...。
发布于 2012-05-26 13:56:24
请不要使用SCAN_AND_FILTER_ROWS,当您只选择一行时,会导致性能问题。
一些让它更快的方法:
https://stackoverflow.com/questions/10750001
复制相似问题