0

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

使用超表我希望获得最佳性能,但是当我在 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

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

4

2 回答 2

2

我从未使用过 Hypertable,但只是阅读文档表明该SCAN_AND_FILTER_ROWS子句可能是一个问题:

对于查询大量行间隔(例如 10,000+)的情况,这是一个显式优化。此选项不会单独获取每个行间隔,而是会导致系统执行全表扫描并过滤结果以找到所需的行。谨慎使用此选项,对于较少数量的行间隔,它可能会非常低效。

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

阅读更多文档表明可以使用以下构造进行批处理:

| '(' [row_key relop] ROW relop row_key
      (OR [row_key relop] ROW relop row_key)* ')'

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

于 2012-05-25T07:15:19.660 回答
1

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

一些使它更快的方法:

  • 创建一个 TableScanner 并将多行添加到 ScanSpec 以避免发送许多小型网络消息的开销(这是 Daniel Renshaw 建议的)
  • 如果您的行键在一个范围内,那么您还可以获取一系列行键
  • 如果您的行键有一个公共前缀,那么您可以使用前缀搜索(WHERE ROW =^ "prefix")
于 2012-05-26T05:56:24.160 回答