5

有时我们需要在 AWS S3 中将大文件从一个存储桶复制到另一个存储桶。只要有可能,我们就使用 CopyRequest 在 AWS 上处理此操作(因为不需要返回客户端)。但有时我们没有这样做的选项,因为我们需要在 2 个完全独立的帐户之间进行复制,这需要一个GET和一个PUT

问题:

  1. 从 GET 返回的响应流不可搜索,因此无法传递给 PUT 请求并使其从一个无缝流到另一个
  2. 使用 CopyTo() 将响应流复制到中间流 (MemoryStream),然后将其传递给 PUT 操作效果很好,但无法扩展(大文件将引发 OutOfMemory 异常)

所以基本上我需要一个可以同时读/写的中间流,基本上我会从响应流中读取一个块并将其写入我的中间流,同时 PUT 请求正在读取内容,它只是一个无缝直通的场景。

我在 stackoverflow 上找到了这篇文章,起初它看起来很有希望,但它仍然会引发大文件的 OutOfMemory 异常。

.NET 异步流读/写

有人不得不做类似的事情吗?你将如何应对?提前致谢

4

2 回答 2

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 回答
3

我发现了这一点,但它在内部使用了一个队列,作者指出它比 MemoryStream 慢一个数量级。

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

我一直希望我能找到一个官方的 MS 库解决方案,但似乎这个轮子还没有被正确地发明出来。

于 2013-03-08T15:43:08.313 回答