我有一個自定義文件類型,在帶有標題的部分中實現,顯示文件中每個部分的偏移量和長度。現在,無論何時我想與文件進行交互,我都必須先加載並解析整個事物,否則只選擇我需要的部分並加載它們。按需打開自定義文件
我想要做的是實現混合的方法,其中每個部分按需加載。
似乎這樣做有很多潛在的缺點,在離開文件系統句柄時打開的時間比我想要的要長,並且會產生額外的代碼複雜度。
這種事情有沒有任何標準模式?看來,我的選擇是:
- 就加載整個文件,並停止嘟囔關於週期/內存浪費
- 加載整個文件到內存中的原始字節,然後滿足從卸載部分的任何請求內存緩衝區而不是磁盤。這爲我節省了解析不需要的部分的成本,並且需要更少的內存(因爲磁盤表示比它周圍的對象模型更緊湊),但仍然意味着我浪費內存來存放我從未最終加載的部分。
- 加載我需要的任何部分,然後關閉文件,但保留文件的源位置。然後如果請求另一部分,請重新打開文件並加載數據。在這種情況下,如果底層文件被更改,我可能會得到奇怪的結果。
- 與上面相同,但保留文件句柄打開(也許允許讀共享)。
- 使用內存映射IO加載文件並在打開的文件上留下一個視圖。
任何想法
*移動它*,我不知道那個伎倆。你有一些信息來馴服我的好奇心嗎? :-) – 2009-07-31 17:25:49
那麼,從技術上說,你不能移動現有的視圖。但是,您可以取消映射舊視圖並在同一個mmap的不同部分中重新映射新視圖。您甚至可以同時擁有同一個mmap活動的多個視圖。我使用這種技術來滾動瀏覽數兆字節(有時是幾千兆字節)的日誌文件,並且它非常快速地工作。 – 2009-08-01 00:23:39