无法使用MemoryMappedViewStream读取大型日志文件

时间:2018-12-10 20:29:47

标签: c# memory

问题:是否可以使用MemoryMappedViewStream读取超过2GB的文件?

我正在尝试读取1到12 GB之间的任何日志文件。 1GB的文件显示为OK,但是读取4GB的文件时出现以下错误:

  

System.IO.IOException HResult = 0x80070008消息=不够   存储空间可用于处理此命令。

     

Source = System.Core StackTrace:在   System.IO .__ Error.WinIOError(Int32 errorCode,字符串mayFullPath)
  在   System.IO.MemoryMappedFiles.MemoryMappedView.CreateView(SafeMemoryMappedFileHandle   memMappedFileHandle,MemoryMappedFileAccess访问,Int64偏移量,   int64大小)   System.IO.MemoryMappedFiles.MemoryMappedFile.CreateViewStream(Int64   偏移量,Int64大小,MemoryMappedFileAccess访问)   System.IO.MemoryMappedFiles.MemoryMappedFile.CreateViewStream()在   ExchIISParserLib.LogParser.ParseLogs(Int32 daysago)在   ...

我的系统有足够的磁盘和内存空间可用于读取4GB文件。有问题的代码行是:

MemoryMappedViewStream memoryMappedViewStream = MemoryMappedFile.CreateFromFile(log, FileMode.Open).CreateViewStream();

在研究工作中,我发现当文件超过2GB时,MemoryMappedViewStream似乎有问题。

https://stackoverflow.com/a/49738895/4630376

我已经研究了CreateViewStream()方法的offset和size参数。但是这些文件似乎只是在指定文件上创建一个静态窗口,而该窗口不会读取整个文件。

1 个答案:

答案 0 :(得分:0)

内存映射视图流是内存映射视图上的流。它不会在整个文件上提供流,而仅提供您映射的部分。您仍将需要分块映射文件以读取整个内容。除非您确实需要共享内存,否则最好分块读取文件。