gpt4 book ai didi

c# - 内存映射文件 : IOException on CreateViewAccessor for large data

转载 作者:太空狗 更新时间:2023-10-29 23:33:58 25 4
gpt4 key购买 nike

我正在使用内存映射文件的托管包装器处理大型且不断增长的文件:MemoryMappedFileMemoryMappedViewAccessor

我使用这段代码创建空文件:

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 内存。据我所知,所有这些都应该无关紧要。这些是大量数据,是的,但是据我了解,MemoryMappedFile 和相关类是处理此类大量数据的方法。

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

如前所述,该应用程序会根据需要定期增加文件大小,实际上,错误会随机发生在 ~400MB 和 ~2GB 之间的某个时间点。当从 1GB 开始时,总是成功的。当以默认的 1MB 开始时,它失败得更快,大概是由于释放和重新分配资源。 (我总是在 View 、MMF 和流上FlushClose)。

我需要随机访问整个数据范围。我希望我不需要动态维护 MemoryMappedViewAccessor 对象的字典 - 我对此处使用的虚拟内存系统的解释表明,来自任何大小的文件的页面都将被调入调出根据 Windows 中的内存系统的需要。

以问题的形式:为什么会这样?我怎样才能阻止它?有没有更好的方法来实现对任意大小文件的完全、随机、读写访问?例如高达 100GB?

最佳答案

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

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

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

关于c# - 内存映射文件 : IOException on CreateViewAccessor for large data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7300361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com