2010-09-24 63 views
0

我想知道是否有方法在我用mmap()打开的大型(多GB)文件的开头附近插入空白页。很显然,可以在最后添加一两页,并使用memcpy()将所有内容向前移动,但是这样做会弄脏每个页面,并在最终刷新到磁盘时需要很长时间。在不复制数据的情况下将页面插入大型mmap()文件

我猜测一个解决方案需要在自定义文件系统和手动操作页表之间进行一些复杂的协调:向inode添加一个块,以某种方式更新VMM中的缓存页面以反映这一点,然后以某种方式调整页面表匹配。这听起来不平凡,这让我想知道是否有更好的方法。

这是一个有关Linux内存和文件操作的深层次问题,虽然我很乐意听到有关如何在其他系统中完成这些操作的信息。我并不特别感兴趣的是能够提高复制效率的解决方法,尽管需要重新映射但避免磁盘IO的技术将是一个好的开始。

+0

我预见了很多角落案例 - 例如。该文件的文件句柄偏移会发生什么?其他进程中的文件句柄呢? – caf 2010-09-24 05:46:27

+0

不知道你在做什么,这可能是一个愚蠢的建议,但你可以在你的mmap之前用X页面填充物理文件吗?将第一页中的索引/指针/位移保留在实际数据的起始位置,并根据需要进行更改。更多的工作,但你似乎愿意竭尽全力做好这项工作。 – Duck 2010-09-24 06:09:38

+0

@Duck:我没有设定的目的。在处理全文搜索的大型倒排索引以及寻找更好的B树的方法时,我想要这样的东西。从非常稀疏的文件开始是一个有趣的想法,但不能解决一般情况。 – 2010-09-24 18:54:38

回答

2

在您的文件中嵌入一个简单的FAT。例如,文件的前4k将是FAT页面。数据将在下面的页面中。随着文件的增长,第一个FAT页面可以链接到其他FAT页面。 fat中的每个条目都是数据页索引和下一个FAT条目的索引。 FAT条目将是FAT的页面和条目本身页面上的索引。我想你应该已经明白了。 FAT条目是一个链接列表。 FAT页面是一个链表。 FAT条目链接数据页面。这应该是足够的信息来使用remap_file_pages()使您的文件在内存中看起来连续,即使它在磁盘上不连续。

相关问题