系统相关
首页 > 系统相关> > c# – 内存映射文件:CreateViewAccessor上的IOException用于大数据

c# – 内存映射文件:CreateViewAccessor上的IOException用于大数据

作者:互联网

我正在使用内存映射文件的托管包装器处理大型和不断增长的文件:MemoryMappedFile,MemoryMappedViewAccessor.

我使用以下代码创建空文件:

long length = 1024L * 1024L * 1L; // 1MB

// create blank file of desired size (nice and quick!)
FileStream fs = new FileStream(filename, FileMode.CreateNew);
fs.Seek(length, SeekOrigin.Begin);
fs.WriteByte(0);
fs.Close();

// open MMF and view accessor for whole file
this._mmf = MemoryMappedFile.CreateFromFile(filename, FileMode.Open);
this._view = this._mmf.CreateViewAccessor(0, 0, MemoryMappedFileAccess.ReadWrite);

这很好,最高可达1GB.当我尝试2GB时,我得到一个IOException:

Not enough storage is available to process this command.

at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.MemoryMappedFiles.MemoryMappedView.CreateView(SafeMemoryMappedFileHandle memMappedFileHandle, MemoryMappedFileAccess access, Int64 offset, Int64 size)
at System.IO.MemoryMappedFiles.MemoryMappedFile.CreateViewAccessor(Int64 offset, Int64 size, MemoryMappedFileAccess access)
at (my code here)

我有一个64位版本的Windows 7,该应用程序运行为64位,我有6GB的RAM.据我所知,所有这一切都应该是无关紧要的.这些是大量的数据,是的,但据我所知,MemoryMappedFile和相关的类是处理大量数据的方式.

根据文档http://msdn.microsoft.com/en-us/library/dd267577.aspx,IOException的字面意思是“发生了I / O错误”.但是,该文件在磁盘上就好了.

应用程序会根据需要定期增加文件大小,实际上错误发生在~400MB到~2GB之间的某个点上.从1GB开始,总是成功.当从默认的1MB开始时,它会更快地失败,可能是由于释放和重新分配资源. (我总是在视图上刷新和关闭,MMF和流).

我需要随机访问整个数据范围.我希望我不需要动态维护MemoryMappedViewAccessor对象的字典 – 我对这里使用的虚拟内存系统的解释会建议任何大小的文件中的页面将根据内存系统的需要进行分页.视窗.

以问题的形式:为什么会发生这种情况?我怎么能阻止它?有没有更好的方法来实现对任何大小的文件的完整,随机,读写访问?例如高达100GB?

解决方法:

在我选择的特定项目构建配置中,应用确实设置为x86而不是x64.

我的猜测是我的进程地址空间已满,因为它在32位模式下运行.

解决方案 – 将平台目标更改为x64并在64位操作系统上运行.

标签:c,net,memory-mapped-files
来源: https://codeday.me/bug/20190630/1337382.html