5

AWS S3 で巨大なファイルをあるバケットから別のバケットにコピーする必要がある場合があります。可能な限り、CopyRequest を使用して、この操作をすべて AWS で処理します (クライアントへのラウンド トリップが必要ないため)。しかし、 GETPUTを必要とする 2 つの完全に別個のアカウント間でコピーする必要があるため、これを行うオプションがない場合があります。

問題:

  1. GET から返された応答ストリームはシークできないため、PUT 要求に渡して、一方から他方へシームレスにストリーミングすることはできません。
  2. CopyTo() を使用して応答ストリームを中間ストリーム (MemoryStream) にコピーし、それを PUT 操作に渡すことはうまく機能しますが、スケーリングしません (大きなファイルは OutOfMemory 例外をスローします)。

したがって、基本的には、同時に読み書きできる中間ストリームが必要です。基本的には、応答ストリームからチャンクを読み取り、それを中間ストリームに書き込みます。その間、PUT リクエストはコンテンツを読み込んでいます。シームレスなパススルーのシナリオ。

この投稿をstackoverflowで見つけました。最初は有望に思えましたが、それでも大きなファイルでOutOfMemory例外がスローされます。

.NET 非同期ストリームの読み取り/書き込み

これに似たようなことをしなければならなかった人はいますか?どのように対処しますか?よろしくお願いします

4

2 に答える 2

3

私はこれを見つけましたが、内部でキューを使用しています。これは、MemoryStreamよりも桁違いに遅いと著者は述べています。

http://www.codeproject.com/Articles/16011/PipeStream-a-Memory-Efficient-and-Thread-Safe-Stre

公式のMSライブラリソリューションが見つかることを期待していますが、このホイールはまだ適切に発明されていないようです。

于 2013-03-08T15:43:08.313 に答える
3

を使用する理由は明確ではありませんMemoryStream。.NET 4のStream.CopyToメソッドは、中間ストリームを使用する必要はありません。固定サイズのローカル バッファーに読み取り、そのバッファーを出力ストリームに書き込み、さらにデータを読み取る (バッファーを上書きする) だけです。

.NET 4 を使用していない場合は、同様のものを簡単に実装できます。

public static void CopyTo(this Stream input, Stream output)
{
    byte[] buffer = new byte[64 * 1024]; // 64K buffer
    int bytesRead;
    while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0)
    {
        output.Write(buffer, 0, bytesRead);
    }
}
于 2012-08-17T15:22:29.210 に答える