我为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立一个映射。
以前,我使用下面的代码进行随机访问:
char* KeyArray; try { mmapFile = new cMemoryMappedFile(n); } catch (cException e) { throw; } KeyArray = (char *)(mmapFile->GetPointer()); KeyArray[i] = ...
我应该如何修改这个类来处理这些需求?
我看不到你的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。 美国马萨诸塞州。 这两个版本是独立设计的,可能成为数据融合美国专利申请的一部分。