Articles of 内存映射文件

从文件并发处理

考虑下面的代码: std::vector<int> indices = /* Non overlapping ranges. */; std::istream& in = /*…*/; for(std::size_t i= 0; i< indices.size()-1; ++i) { in.seekg(indices[i]); std::vector<int> data(indices[i+1] – indices[i]); in.read(reinterpret_cast<char*>(data.data()), data.size()*sizeof(int)); process_data(data); } 我想使这个代码并行,尽可能快。 使用PPL进行parallizing的一种方法是: std::vector<int> indices = /* Non overlapping ranges. */; std::istream& in = /*…*/; std::vector<concurrency::task<void>> tasks; for(std::size_t i= 0; i< indices.size()-1; ++i) { in.seekg(indices[i]); std::vector<int> data(indices[i+1] […]

使用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的区域?

内存映射文件vs CreateFile / ReadFile

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

使用Win32 / WINAPI通过内存映射文件传输数据

我需要传输一些数据 – char buffer[100000]; – 由我开始的一个孩subprocess。 现在我正在使用一个普通的文件来这样做,父进程将数据写入磁盘上的一个文件,subprocess从磁盘读取并删除文件。 但是,这会导致不必要的写入磁盘,所以我想使用内存映射文件。 除非使用页面文件或交换文件,否则如何创build,写入,然后从内存映射文件中读取数据,以便不将数据写入磁盘? 编辑:我忘了指定,我想使用原始的WINAPI函数,所以代码没有依赖关系。 我正在研究如何做到这一点,准备好后会自己发表一个答案,但如果有人有现成的代码,他们欢迎救我一些努力:)

系统错误0x5:CreateFileMapping()

我希望使用命名共享内存来实现IPC。 为此,其中一个步骤是使用CreateFileMapping()获取映射内存对象的句柄。 我完全按照MSDN网站的build议来做: http : //msdn.microsoft.com/zh-cn/library/aa366551( v=VS.85) .aspx : hFileMappingHandle = CreateFileMapping ( INVALID_HANDLE_VALUE, // use paging file NULL, // default security PAGE_READWRITE, // read/write access 0, // maximum object size (high-order DWORD) 256, // maximum object size (low-order DWORD) "Global\\MyFileMappingObject" // name of mapping object ); DWORD dwError = GetLastError(); 但是,返回的句柄始终是0x0 ,并且返回的系统错误代码是: 0x5(拒绝访问)。 只有命名内存共享所需(不是文件共享)。 […]

释放内存映射的内存

我是一个内存映射一个大文件(~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上保证?