异步读取/写入同一个流?(Asynchronous Reading/Writing to same

2019-09-21 08:19发布

有时,我们需要巨大的文件从一个水桶在AWS S3复制到另一个。 只要有可能,我们使用CopyRequest处理(因为需要返回给客户端没有往返)此操作全部在AWS。 但有时我们没有这样做,因为我们需要它需要2个完全独立的账户之间进行复制的选项GET然后PUT 。

问题:

  1. 流从GET返回的响应是不可搜索,因此它不能被传递到PUT请求并将它从一个无缝流式传输到其它
  2. 复制响应流使用CopyTo从()的中介流(MemoryStream的),然后传递一个认沽操作效果很好,但没有规模(大文件会抛出OutOfMemory异常)

所以基本上我需要,我可以读/同时写入到一个中介流,基本上我会从响应流中读取一个数据块,并将其写入我的中介流,同时PUT请求被读出的内容和它只是一个无缝直通那种情景。

我发现计算器这篇文章,它似乎在第一前途的,但它仍然抛出大文件的内存不足异常。

.NET异步流读取/写

任何人都曾经有过做类似这样的东西吗? 你会如何应对呢? 谢谢advcance

Answer 1:

目前尚不清楚你为什么会想使用MemoryStream 。 所述Stream.CopyTo在.NET 4方法并不需要使用一个中间流-它只是读入一个固定大小的本地缓冲器,然后写入该缓冲器到输出流,然后读更多的数据(覆盖缓冲液)等等

如果你不使用.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);
    }
}


Answer 2:

我发现这一点,但它内部使用一个队列,这是作者的笔记是数量级比一个MemoryStream慢的顺序。

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

我一直希望我会找到一个正式MS库解决方案,但似乎这轮没有正确发明出来。



文章来源: Asynchronous Reading/Writing to same stream?
标签: c# io .net