我正在使用内存映射文件的托管包装器处理大型且不断增长的文件: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和流上总是Flush
和Close
。
我需要随机访问整个数据范围。我希望我不需要动态维护MemoryMappedViewAccessor
对象的字典 - 我对此处使用的虚拟内存系统的解释会建议任何大小的文件中的页面将根据需要进行分页。 Windows中的内存系统。
以问题的形式:为什么会发生这种情况?我怎么能阻止它?有没有更好的方法来实现对任何大小的文件的完整,随机,读写访问?例如高达100GB?
答案 0 :(得分:3)
在我选择的特定项目构建配置中,应用确实设置为x86而不是x64。
我的猜测是我的进程地址空间已满,因为它以32位模式运行。
解决方案 - 将平台目标更改为x64并在64位操作系统上运行。