是否可以在2GB +文件上创build更小的内存映射视图?

我为Windows和Linux编写了一个C ++类,为任意大小的文件n创build一个内存映射视图。 这里可以看到类构造函数代码。 我目前正在testingWindows 32位XP上的代码

我发现文件大小为0 <n <= 1.7GB,构造函数返回一个指向内存映射视图的有效指针。 但是,对于大于等于2 GB的文件,MapViewOfFile将返回一个NULL值和一个错误代码8,“没有足够的存储可用于处理此命令”。 很明显,Windows在这个过程中找不到一个大小为2GB的可用地址空间。

因此,我可能需要修改类构造函数,以创build一组总共大于等于2GB字节的小内存映射视图&& <2 ^ 32 – 1个字节。 另一个要求是在每个较小的内存映射视图与进程地址空间中的一个随机访问的地址之间build立一个映射。

以前,我使用下面的代码进行随机访问:

.Net跳过代码

如何创build/插入WMI对象?

使c ++程序以交互方式将input输出传递给windows命令提示

编写一个audio源filter,用作Lync麦克风

如何使其他函数作为除C中main()之外的入口点

char* KeyArray; try { mmapFile = new cmemoryMappedFile(n); } catch (cException e) { throw; } KeyArray = (char *)(mmapFile->GetPointer()); KeyArray[i] = ...

我应该如何修改这个类来处理这些需求?

导入msado15.dll

boost :: bind返回一个函数对象,它是需要指针的函数的参数

将主消息循环中GetMessage()返回-1?

远程debugging器:指定的帐户不存在

为什么nasm说我在g ++创build的程序集中有错误

我看不到你的pastebin链接,但我可以建议一个简单的解决方案与c + +类的声明。 我认为这个实施应该从评论中显而易见:

class ShiftingMemmap { public: // constructs a dynamically shifting memory map of a file... ShiftingMemmap ( const char* fileName,size_t view_size = 4096 ); // retrieve/set a byte at the given file offset. If the offset is not currently in-view,// shift the view to encompass the offset. The reference should not be stored for later // access because the view may need to shift again... byte& operator [] ( unsigned int_64_t offset ); private: int_64_t current_offset; size_t current_size; };

所有这一切,你可以写一个类,返回一个文件的多个视图,以便以后保存一个引用,也可以同时编辑文件的不同部分,而不必重复地移动视图。

class Memmap { public: Memmap ( const char* filename ); shared_ptr<MemmapView> View ( unsigned int_64_t offset,size_t size = 4096 ); }; class MemmapView { public: char& operator[] ( size_t offset ); };

你想要什么可以实现使用repaed,看看它是如何完成boost.iostreams 在这里

用户进程空间在32位操作系统上只有2GB(或3GB,有些调整)。 期。 这是一个严格的限制,并没有创造许多较小的映射可以解决这个问题。 你将需要改变你的映射,以访问文件的不同部分。 但它仍然比寻求,阅读和写作更快。

这是不行的。 你根本无法使用32位Windows上的所有4 GiB的地址空间。 重新设计您对数组的访问权限,只映射大文件的小视图。

是的,可以为Windows,Solaris Unix,Linux编写C ++类,为任意大小为n的文件创建内存映射视图。 我们刚刚完成了两个版本的课程,一个是使用STL,另一个是我的老板写的,不使用STL。 在32位Windows,Linux,Solaris Unix上,两种版本的内存分配大小均为1 GB或更多时,都比使用堆更好。 这两个版本也兼容64位Windows,Linux,Solaris Unix。 如果你想了解更多的细节,请发邮件给我frankchang91@gmail.com。 美国马萨诸塞州。 这两个版本是独立设计的,可能成为数据融合美国专利申请的一部分。

相关文章

可以认为OpenFeign是Feign的增强版,不同的是OpenFeign支持S...
为进一步规范小程序交易生态、提升用户购物体验、满足用户在...
云原生之使用Docker部署Dashdot服务器仪表盘
本文主要描述TensorFlow之回归模型的基本原理
1.漏洞描述Apache Druid 是一个集时间序列数据库、数据仓库和...
内部类(当作类中的一个普通成员变量,只不过此成员变量是cl...