4

あるリージョンから別のリージョンにコピーするキーが 50 億以上あります。現在、私はスレッド化とマルチプロセッシングを行っていますが、得られる結果は私のニーズに対して少し遅いです。PUT1000 のコピー リクエストに対して、8 秒からほぼ 2 分 (平均約 50 秒) かかります。これが完了するまでに1年近くかかります。

これについてもっと速い方法を知っている人はいますか?私はpythonのasyncoreモジュールについて読んでいましたが、有望に見えますが、かなり混乱しています。boto と非同期コアを統合するにはどうすればよいですか?

4

2 に答える 2

2

残念ながら、多くのリクエストが必要な場合、API は非常に非効率的です。

ここでは、HTTP オーバーヘッドが大きな役割を果たします。API に対して 5 bil COPY リクエストを投げるにはしばらく時間がかかります。各リクエストが 1 つのスレッドをブロックするため、従来の方法で各レスポンスを待つと、スレッドを使用しても何年もかかります (あなたが言ったように、数年)。

したがって、非ブロッキング非同期接続を使用するというあなたのアイデアは素晴らしいスタートです。

残念ながら、私は優れた python 開発者ではないので、boto の基礎となる http クライアントを置き換えることについては本当にお手伝いできません。

この人たちは、tornado.httpclient

おそらく、これを使用して、非同期コアを実装する方法のアイデアを得ることができます

于 2013-01-09T09:28:57.160 に答える
1

非同期コアを使用すると少しは役立つかもしれませんが、最終結果がスレッド化されたソリューションよりもはるかに高速になるとは思いません。S3 で移動するオブジェクトが 50 億ある場合、余裕のある数の EC2 インスタンス間で作業を分割する方法を見つけます。難しいのは、ワーカー インスタンス間で作業を分割する方法を見つけることです。

  • を使用してバケット内のすべてのオブジェクトのリストを収集し、list_keys移動が必要なオブジェクトごとに SQS のメッセージをキューに入れることができます。次に、すべて同じキューから読み取りを行う N 個の EC2 インスタンスを起動します。ただし、キーを一覧表示するだけでも時間がかかり、50 億のメッセージをキューに入れるのにも時間がかかります。

  • オブジェクトが S3 で自然に分割されている場合は、それを利用できます。たとえば、疑似階層がある場合、各インスタンスを異なる で開始できますprefix

  • オブジェクト名が別のデータベースに保存されている場合、オブジェクト キーの N 個の個別ファイルを生成し、N 個の EC2 インスタンスのそれぞれに 1 つのファイルを渡すことができます。

他の可能性もあるかもしれません。あなたの特定の状況についての詳細がなければ、知ることは困難です. ただし、妥当な時間内にこれを完了したい場合は、EC2 インスタンス間で作業を分散させる何らかの方法を見つける必要があると思います。

于 2013-01-09T14:41:01.143 に答える