2010-09-24 67 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()使您的文件在內存中看起來連續,即使它在磁盤上不連續。

相關問題