用C++編輯一個大文件(〜100Mg)的第一行有沒有「快速」的方法?用C++編輯一個巨大文件的第一行
我知道我們可以逐行讀取文件,進行更改,將其寫入臨時文件並重命名臨時文件。但是,我想知道是否有更快的方式來做到這一點(比如就地修改)?
用C++編輯一個大文件(〜100Mg)的第一行有沒有「快速」的方法?用C++編輯一個巨大文件的第一行
我知道我們可以逐行讀取文件,進行更改,將其寫入臨時文件並重命名臨時文件。但是,我想知道是否有更快的方式來做到這一點(比如就地修改)?
您可以使用fwrite
/fprintf
文件操作方法根據文件指針的位置寫入文件。
用fopen
打開文件進行追加,使用fseek
開始並寫出所需內容。但是,您應該小心第一行的長度。如果你寫的比原來的行少,你仍然會留下剩餘的額外內容。如果你寫更多,你會覆蓋你的其他內容。
如果行長度發生變化,您可以在文件中將文件中的其他內容向前或向後移動,同時在讀寫之間調用一系列反彈「fseek()」調用。這可以避免臨時佔用大文件存儲的兩倍。但是,如果您的班次中斷(例如,進程死亡),則文件可能會處於中間狀態。我使用這種方法在生成一個新文件後添加一個頭文件,如果寫入被中斷,可以拋棄它。 –
@MiltoxBeyond,你會怎麼想只在文件的第一行做一個'mmap',然後寫入指針? – Alejandro
100MB在現代電腦上並不那麼大。如果這是一次性交易,而且您不是在一臺非常慢的設備上工作,那麼您可以簡單地閱讀整個文件,將其分成幾行,進行編輯並立即寫回。
如果這種情況會更頻繁地發生,您可以從第一行添加一些空格填充(如果可能),爲下次可以放入的東西創建一個「緩衝區」,從中受益。然後你可以使用fwrite來覆蓋第一行,而不用觸及文件的其餘部分。
可能有操作系統和文件系統特定的方式來分配現有文件中的額外空間而不移動數據。例如在Linux與XFS/EXT4可以使用fallocate
:
int fallocate(int fd, int mode, off_t offset, off_t len);
fallocate()允許調用者直接操作用於通過FD的字節範圍稱爲文件分配的磁盤空間開始偏移量和繼續len字節。
你在想一個memory-mapped file,其中整個文件「映射」到內存但不實際加載或重寫,直到您試圖訪問或修改它的一部分的。在POSIX系統上,你可以將mmap()
作爲文件的一部分(比如第一個千字節),根據需要進行修改,然後使用msync()
將該塊內存寫回磁盤。
我相信完成任務的最快方法是創建一個包含第一行值的新文件。每當讀取文件請求時,首先讀取第一行值文件,然後讀取較大的文件,跳過實際存儲在較大文件中的第一行。無論何時您想更改第一行,只需更改第一行文件即可。
如果新線和舊線尺寸相同,您可能可以做到。如果沒有,這是不可能的。 –
順便說一句,這個問題不是C++特有的。 Java或任何其他語言不會幫助你。 – deviantfan
如果新行比舊行更短,可以用空格填充。 –