问题:是否可以使用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参数。但是这些文件似乎只是在指定文件上创建一个静态窗口,而该窗口不会读取整个文件。
答案 0 :(得分:0)
内存映射视图流是内存映射视图上的流。它不会在整个文件上提供流,而仅提供您映射的部分。您仍将需要分块映射文件以读取整个内容。除非您确实需要共享内存,否则最好分块读取文件。