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を使用しないでください。1つの行を選択するだけでパフォーマンスの問題が発生します。

それを速くするいくつかの方法:

  • TableScannerを作成し、ScanSpecに複数の行を追加して、多数の小さなネットワークメッセージを送信するオーバーヘッドを回避します(これはDaniel Renshawが提案したものです)
  • 行キーが範囲内にある場合は、行キーの範囲をフェッチすることもできます
  • 行キーに共通のプレフィックスがある場合は、プレフィックス検索を使用できます(WHERE ROW = ^ "prefix")
于 2012-05-26T05:56:24.160 に答える