我想知道是否有方法在我用mmap()打開的大型(多GB)文件的開頭附近插入空白頁。很顯然,可以在最後添加一兩頁,並使用memcpy()將所有內容向前移動,但是這樣做會弄髒每個頁面,並在最終刷新到磁盤時需要很長時間。在不復制數據的情況下將頁面插入大型mmap()文件
我猜測一個解決方案需要在自定義文件系統和手動操作頁表之間進行一些複雜的協調:向inode添加一個塊,以某種方式更新VMM中的緩存頁面以反映這一點,然後以某種方式調整頁面表匹配。這聽起來不平凡,這讓我想知道是否有更好的方法。
這是一個有關Linux內存和文件操作的深層次問題,雖然我很樂意聽到有關如何在其他系統中完成這些操作的信息。我並不特別感興趣的是能夠提高複製效率的解決方法,儘管需要重新映射但避免磁盤IO的技術將是一個好的開始。
我預見了很多角落案例 - 例如。該文件的文件句柄偏移會發生什麼?其他進程中的文件句柄呢? – caf 2010-09-24 05:46:27
不知道你在做什麼,這可能是一個愚蠢的建議,但你可以在你的mmap之前用X頁面填充物理文件嗎?將第一頁中的索引/指針/位移保留在實際數據的起始位置,並根據需要進行更改。更多的工作,但你似乎願意竭盡全力做好這項工作。 – Duck 2010-09-24 06:09:38
@Duck:我沒有設定的目的。在處理全文搜索的大型倒排索引以及尋找更好的B樹的方法時,我想要這樣的東西。從非常稀疏的文件開始是一個有趣的想法,但不能解決一般情況。 – 2010-09-24 18:54:38