2009-07-29 62 views
1

我有一個自定義文件類型,在帶有標題的部分中實現,顯示文件中每個部分的偏移量和長度。現在,無論何時我想與文件進行交互,我都必須先加載並解析整個事物,否則只選擇我需要的部分並加載它們。按需打開自定義文件

我想要做的是實現混合的方法,其中每個部分按需加載。

似乎這樣做有很多潛在的缺點,在離開文件系統句柄時打開的時間比我想要的要長,並且會產生額外的代碼複雜度。

這種事情有沒有任何標準模式?看來,我的選擇是:

  1. 就加載整個文件,並停止嘟囔關於週期/內存浪費
  2. 加載整個文件到內存中的原始字節,然後滿足從卸載部分的任何請求內存緩衝區而不是磁盤。這爲我節省了解析不需要的部分的成本,並且需要更少的內存(因爲磁盤表示比它周圍的對象模型更緊湊),但仍然意味着我浪費內存來存放我從未最終加載的部分。
  3. 加載我需要的任何部分,然後關閉文件,但保留文件的源位置。然後如果請求另一部分,請重新打開文件並加載數據。在這種情況下,如果底層文件被更改,我可能會得到奇怪的結果。
  4. 與上面相同,但保留文件句柄打開(也許允許讀共享)。
  5. 使用內存映射IO加載文件並在打開的文件上留下一個視圖。

任何想法

回答

1

如果可能的話,MMAP-ING整個文件通常是做如果你有一個隨機訪問模式最容易的事情。這樣,您只需將加載/卸載問題委派給操作系統,並免費提供。

如果你有非常特殊的訪問模式,你甚至可以使用像fadvise()(我沒有完全相同的Win32)來告訴操作系統你的訪問意圖。

如果您的文件大於2GB,您可以選擇64位方式或按需mmap()文件。

1

如果文件比較小,整個文件的mmap就足夠了。如果文件很大,可以打開一個mmap視圖,只需將其移動到文件中並調整大小即可在需要時查看每個部分。

+0

*移動它*,我不知道那個伎倆。你有一些信息來馴服我的好奇心嗎? :-) – 2009-07-31 17:25:49

+0

那麼,從技術上說,你不能移動現有的視圖。但是,您可以取消映射舊視圖並在同一個mmap的不同部分中重新映射新視圖。您甚至可以同時擁有同一個mmap活動的多個視圖。我使用這種技術來滾動瀏覽數兆字節(有時是幾千兆字節)的日誌文件,並且它非常快速地工作。 – 2009-08-01 00:23:39