0

次のステートメントは、たとえば 5 億行という多数の行を処理しながら、プログラムの効率を向上させるのにどのように役立ちますか。

ランダムパーティショナー:

get_range()

注文されたパーティショナー:

get_range(start='rowkey1',finish='rowkey10000')

get_rangeまた、100 万行を超える列ファミリーを持つ順序付きパーティショナーを使用しているときに、一度に処理できる行数。

ありがとう

4

2 に答える 2

1

編集: Tyler Hobbs は、この回答が pycassa ドライバーには適用されないことをコメントで指摘しています。どうやら、私が以下で言及したすべてのことをすでに処理しているようです。

==========

get_range() を使用して 5 億行すべてを一度に選択できるかどうかという質問の場合、答えは「いいえ」です。Cassandra は要求に応答しようとしてメモリ不足になるためです。

ランダム パーティショナーが使用されている場合、一度に N 行のバッチですべての行を Cassandra にクエリできるかどうかという質問であれば、答えは「はい」です。順序保持パーティショナーを使用する場合との違いは、次のバッチの最初のキーが何であるかがわからないため、現在のバッチの最後のキーを開始キーとして使用し、新しいバッチを反復処理するときに行を無視する必要があることです。バッチ。最初のバッチでは、キー範囲の制限として「空の」キーを使用します。また、順序が保持されないため、返されたキーを見て相対的にどのくらい進んだかを知る方法はありません。

行数については、最初は小さくしてください。10 と言ってから、100 を試してから 1000 を試してください。調べている列の数、インデックスのサイズ、利用可能なヒープなどによっては、特定のしきい値を超えると、単一のクエリのパフォーマンスが著しく低下することがわかります。

于 2014-02-18T12:09:22.667 に答える
1

また、100 万行を超える列ファミリーを持つ順序付きパーティショナーに get_range を使用しているときに、一度に処理できる行数。

pycassa のget_range()方法は、クエリを自動的に小さなチャンクに分割するため、任意の数の行で問題なく機能します。ただし、アプリケーションはメソッドを正しい方法で使用する必要があります。たとえば、次のようなことをするとします。

rows = list(cf.get_range())

Python プログラムは、おそらくメモリ不足になります。それを使用する正しい方法は次のようになります。

for key, columns in cf.get_range():
    process_data(key, columns)

このメソッドは、デフォルトでは一度に 1024 行しか取得しません。必要に応じて、buffer_sizeパラメーター to を使用してそれを下げることができますget_range()

于 2014-02-19T01:14:24.607 に答える