合并FileStream和MemoryStream以避免在接收千兆字节数据时进行磁盘访问/分页?

w128

我正在接收一个文件,作为byte []数据包流(总大小未知),需要在接收到该文件之前将其存储在某个地方,然后立即对其进行处理(我无法即时进行处理) )。接收到的文件总大小可以从10 KB到4 GB以上不等。

  • 存储接收到的数据的一种选择是使用MemoryStream,即一系列MemoryStream.Write(bufferReceived, 0, count)调用来存储接收到的数据包。这非常简单,但是显然会导致大文件的内存不足异常。
  • 另一种选择是使用FileStream,即FileStream.Write(bufferReceived, 0, count)这样,不会发生内存不足异常,但是我不确定是由于磁盘写入而导致的性能下降(只要有足够的可用内存,我就不想发生这种情况)-我想尽可能避免磁盘访问,但是我不知道控制它的方法。

我进行了一些测试,并且在大多数情况下,MemoryStream.Write()vs的10000次连续调用之间似乎没有什么性能差异FileStream.Write(),但很大程度上取决于缓冲区大小和所讨论的数据总量(即写入次数) 。显然,MemoryStream大小重新分配也是一个因素。

  1. 是否有意义使用的组合MemoryStream,并FileStream在默认情况下,即写入内存流,但一旦接收到的数据总量超过例如500 MB,写入到FileStream; 然后,从两个流中读取大块以处理接收到的数据(首先从中处理500 MB MemoryStream,将其处理,然后从中读取FileStream)?

  2. 另一种解决方案是使用自定义内存流实现,该实现不需要连续的地址空间来进行内部数组分配(即,内存流的链表)。这样,至少在64位环境中,内存不足异常不再是问题。缺点:额外的工作,更多的错误余地。

因此,在磁盘访问和内存缓存(即数据大小/性能平衡)方面,FileStreamvsMemoryStream读写行为如何我希望只要有足够的RAM可用,FileStream无论如何都会从内存(缓存)内部进行读写,而虚拟内存将负责其余的工作。但是我不知道FileStream写入时会显式访问磁盘的频率

任何帮助,将不胜感激。

汉斯·帕桑特

不,尝试对此进行优化没有任何意义。Windows本身已经缓存了文件写入,它们由文件系统缓存来缓冲。因此,您的测试是准确的,MemoryStream.Write()和FileStream.Write()都实际写入RAM,并且在性能方面没有显着差异。文件系统驱动程序懒惰地将其写入后台磁盘。

用于文件系统缓存的RAM是在进程声明其RAM需求后剩余的空间。通过使用MemoryStream,您会降低文件系统缓存的效率。换句话说,您将一项交易换为另一项却没有收益。实际上,您的情况更糟,您使用的RAM量是原来的两倍

不用帮助,这已经在操作系统内部进行了优化。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

合并FileStream和MemoryStream以避免在接收千兆字节数据时进行磁盘访问/分页?

来自分类Dev

通过TCP接收字节数据包

来自分类Dev

netstat如何知道接收和发送的字节数?

来自分类Dev

MySQL和Java:检索到的字节数组与存储时的字节数组不同

来自分类Dev

转换为字节数组时图像数据丢失

来自分类Dev

访问结构作为字节数组

来自分类Dev

在Netduino上通过蓝牙接收时,通过SerialPort发送的字节数不相同

来自分类Dev

从websocket接收的字节中获取完整的字节数组

来自分类Dev

使用Ajax无法在服务器端接收字节数组数据

来自分类Dev

Java中的套接字编程,用于发送和接收字节数组

来自分类Dev

当字节数组的源是 jpg 时,从存储的字节数组创建位图并保存到磁盘会引发 GDI+ 异常

来自分类Dev

从字节数组填充TXTextControl时,如何避免丢失文本格式?

来自分类Dev

如何将四个单字节数据合并为整个四个字节数据

来自分类Dev

Python Wave字节数据

来自分类Dev

在Java中排队字节数据

来自分类Dev

从NSString清除基础字节数据

来自分类Dev

将字节数据写入目录

来自分类Dev

字节数组和Except()

来自分类Dev

比较字节数组和向量

来自分类Dev

从ADODB.Recordset访问[对象的字节数组] objectGUID值以进行Active Directory查询

来自分类Dev

如何最小化mysqld写入磁盘的字节数?

来自分类Dev

Java 套接字接收的字节数超出预期

来自分类Dev

x64和x86之间字节数组访问的巨大性能差异

来自分类Dev

如何从由字节数组组成的字符串访问字节数组?

来自分类Dev

如何设计以避免在初始化我的字段时对主线程异常进行数据库访问?

来自分类Dev

在WinVector组件中的IVector <T> ^和C样式的字节数组之间进行转换

来自分类Dev

Matlab-串行超时,但接收到良好的数据并发送了多字节数据类型

来自分类Dev

读取文件到字节数组时的冗余字节

来自分类Dev

从NumPy数组创建Python字节数组时,多余的数据从何而来?

Related 相关文章

  1. 1

    合并FileStream和MemoryStream以避免在接收千兆字节数据时进行磁盘访问/分页?

  2. 2

    通过TCP接收字节数据包

  3. 3

    netstat如何知道接收和发送的字节数?

  4. 4

    MySQL和Java:检索到的字节数组与存储时的字节数组不同

  5. 5

    转换为字节数组时图像数据丢失

  6. 6

    访问结构作为字节数组

  7. 7

    在Netduino上通过蓝牙接收时,通过SerialPort发送的字节数不相同

  8. 8

    从websocket接收的字节中获取完整的字节数组

  9. 9

    使用Ajax无法在服务器端接收字节数组数据

  10. 10

    Java中的套接字编程,用于发送和接收字节数组

  11. 11

    当字节数组的源是 jpg 时,从存储的字节数组创建位图并保存到磁盘会引发 GDI+ 异常

  12. 12

    从字节数组填充TXTextControl时,如何避免丢失文本格式?

  13. 13

    如何将四个单字节数据合并为整个四个字节数据

  14. 14

    Python Wave字节数据

  15. 15

    在Java中排队字节数据

  16. 16

    从NSString清除基础字节数据

  17. 17

    将字节数据写入目录

  18. 18

    字节数组和Except()

  19. 19

    比较字节数组和向量

  20. 20

    从ADODB.Recordset访问[对象的字节数组] objectGUID值以进行Active Directory查询

  21. 21

    如何最小化mysqld写入磁盘的字节数?

  22. 22

    Java 套接字接收的字节数超出预期

  23. 23

    x64和x86之间字节数组访问的巨大性能差异

  24. 24

    如何从由字节数组组成的字符串访问字节数组?

  25. 25

    如何设计以避免在初始化我的字段时对主线程异常进行数据库访问?

  26. 26

    在WinVector组件中的IVector <T> ^和C样式的字节数组之间进行转换

  27. 27

    Matlab-串行超时,但接收到良好的数据并发送了多字节数据类型

  28. 28

    读取文件到字节数组时的冗余字节

  29. 29

    从NumPy数组创建Python字节数组时,多余的数据从何而来?

热门标签

归档