【问题标题】:MemoryStream vs an array of bytesMemoryStream 与字节数组
【发布时间】:2009-06-12 17:21:24
【问题描述】:

在使用 MemoryStream 时,我发现自己经常将数据复制(因此复制)到一个临时的字节数组中。

我认为这有点浪费资源,因为 MemoryStream 不允许你直接访问底层字节数组。

在这种情况下,MemoryStream 的真正优势是什么?我在某处读到它就像一个内存映射文件。数据仅在访问时从磁盘获取,消耗的内存更少。

这是真的吗?我不这么认为。也许是 FileStream 的情况?

感谢您的澄清。

【问题讨论】:

  • 这是使用哪种语言和库?

标签: .net arrays byte memorystream


【解决方案1】:

对我来说,内存流的主要优点是它可以动态增长,并且为此进行了优化。 不得不将其复制出来并复制内存是一件很痛苦的事情,但如果您主要使用它是构建一个在进程结束时传递的缓冲区,那么该缺陷在某种程度上被摊销了。

我应该补充一点,与 FileStream 相比,MemoryStreams 快得多。它们的大小比 FileStreams 更受限制,因为您通常拥有比 RAM 更多的磁盘空间。所以你必须决定是需要速度还是空间。

【讨论】:

  • 好吧,在这两种情况下(MemoryStream 或 FileStream),Read 和 Write 方法都采用整数作为偏移量和计数。所以我认为它们可以达到相同的大小。
  • 理论上可以,但是记住MemoryStream是存储在Memory中的,所以当RAM满了就开始分页,这会导致应用程序变慢,过一段时间系统变慢(由于RAM 和页面已满)。
  • 是的,我注意到一个有趣的事情是流的 Length 属性很长(8 个字节)。您甚至无法使用 Read 和 Write 方法引用那么大的文件。我很确定它与本机 win32 API 有关。
  • 您当然可以使用 Read() 方法读取大小超过 Int32 空间的文件 - 您只需多次调用它并将每个填充的缓冲区写入例如,内存流。 Read() 不保证返回您请求的确切字节数,因此无论如何您都会在循环中调用 Read()。
  • @NorthWind:“读取和写入方法采用整数作为偏移量和计数”- 偏移量和计数应用于缓冲区读取或写入,而不是流!
【解决方案2】:

您可以使用getBuffer 函数获取底层字节缓冲区(但前提是您从提供的字节数组创建了 MemoryStream,如果您希望能够直接操作缓冲区,这很有用)

使用 MemoryStream 的唯一优势是,如果您使用的是基于流的 API,或者您是否需要字节缓冲区能够动态增长..

【讨论】:

  • “仅当...来自您提供的字节数组”不正确。检查the docs:返回The byte array from which this stream was created, or the underlying array if a byte array was not provided to the MemoryStream constructor during construction of the current instance. 实际上,如果您确实在构造时提供了一个数组并希望GetBuffer 返回它,您必须使用带有publiclyVisible 标志的构造函数重载并将其设置为true,否则你会得到一个UnauthorizedAccessException
猜你喜欢
  • 1970-01-01
  • 2010-09-06
  • 2014-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-20
  • 1970-01-01
相关资源
最近更新 更多