4

大量のデータをDynamoDBにインデックス付けし、バッチ書き込みを試して実際のスループットを向上させています(つまり、インデックス作成を高速化しています)。これがコードのブロックです(これは元のソースです):

def do_batch_write(items,conn,table):
    batch_list = conn.new_batch_write_list()
    batch_list.add_batch(table, puts=items)
    while True:
            response = conn.batch_write_item(batch_list)
            unprocessed = response.get('UnprocessedItems', None)
            if not unprocessed:
                    break
            # identify unprocessed items and retry batch writing

botoバージョン2.8.0を使用しています。items25を超える要素がある場合、例外が発生します。この制限を増やす方法はありますか?itemsまた、短い場合でも、1回の試行ですべてを処理できない場合があることに気付きました。ただし、これが発生する頻度、または試行後に未処理のままになっている要素の数と、の元の長さの間には相関関係がないようですitemsこれを回避し、すべてを1回の試行で書き込む方法はありますか?現在、最終的な目標は、繰り返しを回避するだけでなく、処理を高速化することです。そのため、連続する試行の間に長時間スリープすることはできません。

どうも

4

3 に答える 3

5

ドキュメントから:

「BatchWriteItem操作は、1つ以上のテーブルに複数のアイテムを配置または削除します。BatchWriteItemへの1回の呼び出しで、最大16 MBのデータを書き込むことができます。これには、最大25の書き込みまたは削除要求を含めることができます。書き込まれる個々のアイテムは最大で大きくなる可能性があります。 400KBとして。」

一部が成功しなかった理由は、おそらくテーブルのプロビジョニングされたスループットを超えているためです。テーブルに対して同時に実行されている他の書き込み操作がありますか?より多くのアイテムが処理されるかどうかを確認するために、テーブルの書き込みスループットを上げてみましたか。

リクエストごとに25アイテムの制限を増やす方法はわかりませんが、AWSフォーラムまたはサポートチャネルを通じて質問してみてください。

最大のスループットを得る最良の方法は、書き込み容量の単位をできるだけ高くし、複数のスレッドまたはプロセス間でバッチ書き込み操作を並列化することだと思います。

于 2013-03-26T15:15:23.293 に答える
4

私の経験から、バッチ書き込みまたはマルチスレッドのいずれかを使用して書き込みスループットを最適化しようとしても、得られるものはほとんどありません。バッチ書き込みはネットワーク時間を少し節約し、マルチスレッドはアイテムサイズの制限が非常に低く、ボトルネックがDDBによる要求の抑制であることが多いため、ほとんど何も節約しません。

したがって、(好むと好まざるとにかかわらず)DynamoDBの書き込み容量を増やすことが方法です。

ああ、garnaatが言ったように、リージョン内のレイテンシーは、リージョン間またはAWSの外部とは実際に異なることがよくあります(15ミリ秒から250ミリ秒など)。

于 2013-03-27T12:55:20.033 に答える
2

書き込み容量を増やすだけでなく、高速になります。

HASH KEYの多様性が不十分な場合、書き込み容量を増やしても、スループットエラーが発生する可能性があります。

スループットエラーは、ヒットマップによって異なります。

例:ハッシュキーが1〜10の数値で、ハッシュ値が1〜10のレコードが10個あるが、値が10のレコードが10kの場合、書き込み容量を増やしても、多くのスループットエラーが発生します。

于 2015-11-02T14:33:00.393 に答える