【问题标题】:IEnumerable<Stream> to One big Stream or MemoryStreamIEnumerable<Stream> 到一个大流或 MemoryStream
【发布时间】:2021-09-10 04:01:23
【问题描述】:

我有 IEnumerable 流。如何将其转换为一个大的 MemoryStream 或字节 []。 我希望流中的所有流都附加到一个大流/内存流中。通过迭代所有流,我们遇到了某些性能问题。我正在寻找最佳解决方案。

                    using (var ms = new MemoryStream())
                        {
                            foreach (var stream in streams)
                            {
                                stream.CopyTo(ms);
                            }
                            byteData = ms.ToArray();
                        }

谢谢

【问题讨论】:

  • foreach 和 Stream.CopyTo 到另一个流,每个副本将从当前位置开始,意味着它会不断增长
  • @TheGeneral:更新问题以显示我所拥有的。这是最好的性能吗?
  • 性能将与您正在写入的流一样好,如果它是内存流,它将与您在不预先分配缓冲区的情况下获得的性能一样好。
  • 我想不出将多个 单独 流合并在内存中修复性能问题;我可以想到很多场景会导致性能问题

标签: c# memorystream


【解决方案1】:

只需拨打stream.CopyTo

复制从当前流中的当前位置开始,并且 复制后不重置目标流的位置 操作完成。

var list = new List<Stream>()
{
   new MemoryStream(new byte[] {1, 2, 3, 4}),
   new MemoryStream(new byte[] {5, 6, 7, 8}),
   new MemoryStream(new byte[] {9, 10, 11, 12})
};

var result = new MemoryStream();

foreach (var stream in list)
   stream.CopyTo(result);

var array =result.ToArray();

Console.WriteLine(string.Join(", ", array));

输出

1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12

【讨论】:

    【解决方案2】:

    您可以使用 VirtualStream 的 IEnumerable 代替 MemoryStream 或 FileStream https://searchcode.com/codesearch/view/14192551/

    基本上当大小超过配置的阈值时,它会自动创建 FileStream。处理后文件将被删除

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      • 2015-04-06
      • 1970-01-01
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多