我正在研究搜索引擎的研究项目,我遇到了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)
使用超强i我希望获得最佳性能,但是当我在hash_array.keys()的20.000或30.000元素上使用它时,我有5-6分钟的结果,所以这很慢。还有其他任何快速执行方式吗?或者我应该将我的计划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
这很好,但这不是最佳解决方案。
答案 0 :(得分:2)
我从未使用过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...
。
答案 1 :(得分:1)
请不要使用SCAN_AND_FILTER_ROWS,只需选择一行就会导致性能问题。
使其更快的一些方法: