Articles of 内存映射文件

使用mmap增加文件的大小

在Windows上的Python中,我可以通过创build一个大文件 from mmap import mmap f = open('big.file', 'w') f.close() f = open('big.file', 'r+') m = mmap(f.fileno(), 10**9) 现在big.file是(大约)1千兆字节。 但在Linux上,这将返回ValueError: mmap length is greater than file size 。 有没有办法像在Windows上一样在Linux上获得相同的行为? 也就是说,能够使用mmap增加文件的大小?

截断内存映射文件

我正在使用内存映射IO的索引文件,但问题是,我不能resize为空的文件。 某处之前: MappedByteBuffer map = raf.getChannel().map(MapMode.READ_WRITE, 0, 1 << 30); raf.close(); // use map map.force(); map = null; 调整: for (int c = 0; c < 100; c++) { RandomAccessFile raf = new RandomAccessFile(indexFile, "rw"); try { raf.setLength(newLen); if (c > 0) LOG.warn("used " + c + " iterations to close mapped byte buffer"); return; […]

使用boost :: iostreams :: mapped_file时的内存使用情况

我在这里粘贴一些代码,使用boost iostream来mmap,然后写入映射文件: typedef unordered_map<int, string> work; int main() { work d; d[0] = "a"; boost::iostreams::mapped_file_params params; params.path = "map.dat"; params.new_file_size = 1000000000; params.mode = (std::ios_base::out | std::ios_base::in); boost::iostreams::mapped_file mf; mf.open(params); work* w = static_cast<work*>((void*)mf.data()); w[0] = d; for(int i=1; i <1000000000 ;++i) { w->insert(std::make_pair(i, "abcdef")); } mf.close(); } 当我用8个处理器和16GB内存在我的centos 6盒子上执行这个时,我观察到下面: 当数据被插入内存映射文件时,RES(来自顶层命令)不断增加,达到了14GB。 我的印象是,当我mmap文件VIRT会增加,而不是RES。 那么当我们写入mmap文件时,首先将其写入内存然后提交到磁盘? 还是有任何中间缓冲区/caching使用? 在“free”命令的帮助下,我还观察到在内存使用量达到16GB后,使用了缓冲区。 […]

mmap如何提高文件的阅读速度?

假设地址空间可以覆盖文件,在我看来,mmap只是简单地分配一块大小与要读取的文件一样大的内存,并在它们相应的块之间创build一个1对1的关系。 但是,为什么这样会加快文件阅读? 看来,为了真正得到文件的内容,你仍然需要去磁盘,并读取所有的字节。 与malloc相同大小的内存相比,它有什么不同,并手动将整个文件读入malloc的区域?

释放内存映射的内存

我是一个内存映射一个大文件(~200GB)到一个单一的区域/视图,并顺序写入它。 每隔一段时间我执行一个boost::interprocess::mapped_region::flush(last, current, false) 。 过了一段时间,该过程耗尽整个系统内存。 据我所知,这是正常的,因为它将释放内存作为其他进程请求内存。 这在Windows 8上运行良好。但是,在Windows 7上运行它似乎没有与AJAvideo卡的驱动程序打好,它开始影响性能(丢弃IO数据包)。 有没有什么办法可以强制Windows 7将内存中的部分内容刷新到磁盘(写入数据后只有几秒钟的时间,记住我正在按顺序遍历整个文件),以便不用整个可用的系统内存?

Windows内存映射文件内容默认情况下始终归零?

我已经根据经验确定,在我的系统中,创build为特定大小的内存映射文件默认情况下始终完全归零。 例如,使用该呼叫 HANDLE hMM = CreateFileMapping (h, NULL, PAGE_READWRITE, 0, 0x01400000,//20MB NULL); ..并写入该文件的映射视图总是导致一个20MB的文件完全归零,除非我写了非零数据。 我想知道如果未初始化的文件的部分可以假设为零。 这种行为一般在Windows上保证?

C ++ MapViewOfFile失败

我正在尝试使用VS2010在Windows上存储映射文件。 我正在做一个DLL。 DLL的第一个实例很好地映射文件。 同一过程中的第二个实例 *ppvData = ::MapViewOfFile( *phMapping, FILE_MAP_READ, 0, 0, 0 ); 失败,错误“没有足够的内存可用于此命令”。 我不知道为什么会发生这种情况。 如果我映射2个不同的文件,而不是两个相同的文件,所有工作正常,所以我不相信“内存不足”的错误消息。 谢谢。 hr = MapFile(sPath, &m_hVoiceData, &m_pVoiceData,wsErr ); HRESULT CTTSEngObj::MapFile( wstring uPath, // Value that contains file path HANDLE * phMapping, // Pointer to file mapping handle void ** ppvData, // Pointer to the data wstring &uError) { HRESULT hr […]

内存映射文件和Win服务 – 找不到由服务器创build的文件

我试图创build一个内存映射文件与Windows服务,因此它可以容纳很多其他Windows应用程序可以使用的静态数据。 我的问题是,当我开始服务 – 服务可以轻松地读取和写入内存映射文件。 但是,Windows应用程序不能。 他们得到一个文件没有find错误。 使用相同的类读取和写入内存映射文件,在两个Windows应用程序中,我没有问题。 所以,我认为使用内存映射文件是正确的,但还有其他的东西 – 可能在我缺less的Windows服务的领域。 我试图添加一个访问控制,但没有帮助。 仍然没有find文件。 无可否认,我对Windows服务不是很有经验。 我试图创build简单的文件来写我的例外,但他们不是从服务创build。 至于帐户,我使用我自己的Windows帐户(我有限,本地pipe理员权限)。 我没有使用networking服务帐户,因为我需要使用我的用户帐户中embedded的凭据访问数据库。 任何想法都会很棒,因为我已经开始旋转我的轮子了。

如何获取文件的下一页/部分/视图,如果我使用MapViewOfFile读取文件的一部分?

我正在尝试使用函数CreateFileMapping,MapViewOfFile,FlushViewOfFile的组合。 总的缓冲区大小大于映射的视图。 示例缓冲区是50KB。 映射视图是2KB。 在这种情况下,我想使用上述函数将总缓冲区写入物理文件。 第一部分我能够写入文件。 但剩下的部分如何写入文件。 我的意思是,如何移动到下一页并写入下一部分数据。 #define MEM_UNIT_SIZE 100 – 第一个模块…内存映射创build器 GetTempPath (256, szTmpFile); GetTempFileName (szTmpFile, pName, 0, szMMFile); hFile = CreateFile (szMMFile, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY, NULL); HANDLE hFileMMF = CreateFileMapping( hFile ,NULL,PAGE_READWRITE,0, (MEM_UNIT_SIZE),pName) 第二个模块…内存写入器 long lBinarySize = 1000; long lPageSize = MEM_UNIT_SIZE; HANDLE hFileMMF = OpenFileMapping(FILE_MAP_WRITE,FALSE,pMemName); LPVOID pViewMMFFile […]

内存映射文件vs CreateFile / ReadFile

使用内存映射文件读取(普通大小的文件)使用CreateFile ReadFile组合执行相同的操作有什么缺点(如果有的话)?