2013-06-12 203 views
0

我試圖優化存儲數據在節點中的存檔格式。隨着時間的推移,容器變得混亂(小的不可用的「空閒」空間節點積聚等)。我正在做的是類似於碎片整理。我已經有了所有數據位置的列表,並且表示了我希望數據處於最終狀態的位置,但是我正在努力完成將實際數據從當前配置移動到最佳配置的任務。元素的大小和大小並不相同(除非您計算字節數)。有一些我可以忽略的明顯方法嗎?我甚至不知道這個問題被稱爲搜索算法,最近我得到了就地排序。重新排列文件的內容

到目前爲止,我嘗試交換數據塊,但我需要跟蹤節點片段,並且它變得太混亂而不可行。

我不想訴諸寫一個臨時副本,然後替換,因爲這些文件非常大。

+0

由於存檔位於文件系統上,因此文件系統不會自動爲該數據自動設置單詞邊界嗎?我問的是,由於文件系統造成的邊界,而不是那些小的不可用的「空閒」空間節點,而不是實際上存檔器? – Magn3s1um

+0

不,這個格式不是那麼低級的,它的字面意思是一個標題,然後是二進制數據,並且可用空間用長度標記,而標記FREE – mcu17818

回答

0

關於性能,將數據複製到新文件很可能是最佳選擇。

如果可用的磁盤空間是一個問題,你有一個有趣的時間在你面前,因爲這需要一些精美的黑客技能來獲得快速。我認爲,最好的辦法是分配一大片緩衝區內存,並在數據駐留在此緩衝區內的文件中保留一個空洞列表。然後你開始填充這個緩衝區,從文件的開頭開始,不合適的地方。一旦緩衝區滿了,您可以將數據從任何位置複製到洞中,並在填充的洞的末尾繼續將數據推入緩衝區。每當你用完緩衝區空間時,你需要跳過最大的可用空間並移動那裏的數據。正如我所說,這並不容易,但它可能很有趣...

+0

聽起來很有趣。只要緩衝區沒有填充無處移動的數據。我想我可以用臨時文件替換緩衝區,如果需要的話,它不應該接近完整文件的大小 – mcu17818

+0

當你「壓縮」可用空間時,你還可以將緩衝區內容追加到文件末尾。一旦達到原始EOF,就可以截斷剩餘的空閒空間或留下供將來使用。 – Ioan

+0

我懷疑將緩衝區寫入文件是值得的,因爲這意味着更多的磁盤訪問。使用上面概述的算法,您只需要讀取和寫入每個字節一次。如果您使用臨時文件,則會增加到兩次。它可能看起來就像一開始一樣快,因爲現代系統會默默地緩衝你的臨時文件,但無論如何它是額外的操作。當然,你總是可以試着證明我錯了...... :-) – cmaster