首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于大型列表或字典中的循环性能

对于大型列表或字典中的循环性能
EN

Stack Overflow用户
提问于 2012-05-25 15:08:45
回答 2查看 191关注 0票数 0

我正在做一个关于搜索引擎的研究项目,我遇到了for循环的性能问题。我有以下问题:

代码语言:javascript
复制
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计划。

查询性能:

代码语言:javascript
复制
  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

在硬件上测试:

代码语言:javascript
复制
8gb 1600mhz
1055t amd

其他事实:

代码语言:javascript
复制
 Without SCAN_AND_FILTER_ROWS: 1.78163504601ms
 With SCAN_AND_FILTER_ROWS: 3.27163504601ms
 Only for loop: 0.0630ms

对于解决方案(来自答案),我有以下几点:

代码语言:javascript
复制
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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-25 15:15:20

我从来没有使用过Hypertable,但简单地阅读documentation就会发现SCAN_AND_FILTER_ROWS子句可能会有问题:

对于查询大量行间隔(例如10,000+)的情况,

这是一种显式优化。此选项将导致系统执行全表扫描并过滤结果以查找所需的行,而不是单独获取每个行间隔。请谨慎使用此选项,对于较少的行间隔数,此选项的效率可能非常低。

如果您一次发送多批密钥,此子句可能会变得更合适。

阅读更多documentation表明,使用以下结构可以进行批处理:

代码语言:javascript
复制
| '(' [row_key relop] ROW relop row_key
      (OR [row_key relop] ROW relop row_key)* ')'

因此,使用100个不同键的析取构造一个查询:ROW=x OR ROW=y OR...

票数 2
EN

Stack Overflow用户

发布于 2012-05-26 13:56:24

请不要使用SCAN_AND_FILTER_ROWS,当您只选择一行时,会导致性能问题。

一些让它更快的方法:

  • 创建一个TableScanner并将多个行添加到前缀中,以避免发送许多小型网络消息的开销(这是Daniel Renshaw建议的)
  • 如果您的行键在某个范围内,则还可以获取行键的范围
  • 如果您的行键具有公共前缀,则可以使用前缀搜索(WHERE row =^ " prefix ")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10750001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档