用于巨大列表或字典中的循环性能

时间:2012-05-25 07:08:45

标签: python performance hypertable

我正在研究搜索引擎的研究项目,我遇到了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

这很好,但这不是最佳解决方案。

2 个答案:

答案 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,只需选择一行就会导致性能问题。

使其更快的一些方法:

  • 创建一个TableScanner并向ScanSpec添加多行,以避免发送许多小型网络消息的开销(这是Daniel Renshaw所建议的)
  • 如果您的行键在某个范围内,那么您还可以获取一系列行键
  • 如果你的行键有一个共同的前缀,那么你可以使用前缀搜索(WHERE ROW = ^“前缀”)