我有200個文件夾,每個文件夾中最多包含20個文件。總數據集是2GB。我試着一次解析所有內容,並將每行放入一個列表中並對它們進行排序,但是內存不足。將多個文件分類到一個文件中
我可以使用什麼方法將多個文件分類到單個文件中?
我有200個文件夾,每個文件夾中最多包含20個文件。總數據集是2GB。我試着一次解析所有內容,並將每行放入一個列表中並對它們進行排序,但是內存不足。將多個文件分類到一個文件中
我可以使用什麼方法將多個文件分類到單個文件中?
基於文件的merge-sort:每個文件的
如果你不想做一個200路歸併排序,可以拆分#3成多合併,排序,然後根據需要,這些結果合併排序,以儘可能多的水平。
請注意,步驟2和3不是合併排序,而是合併。具體來說,[k-way merge](https://en.wikipedia.org/wiki/K-Way_Merge_Algorithms)。而且,實際上,如果您的代碼可以執行20路合併,那麼它可以執行200路合併。在某些時候,你會用盡內存緩衝區,但不是在200. –
@JimMischel我不認爲有合併排序限制爲雙向合併的要求,雖然這通常是這種情況。合併兩個(或更多)排序的子集以生成更大的排序子集,並重復該過程直到所有數據排序爲止的概念,這正是Merge-Sort所做的。我從來沒有說過第2步是合併排序。我在說整個序列(1-3)是一種基於磁盤的多路合併分類。當然,第1步可能在內存中是可行的,並且可以使用任何排序算法,但整體概念是合併排序。 – Andreas
你誤解了我的評論。我只是在說,步驟2和步驟3在技術上不太合理,而只是合併而已。因此,而不是「合併排序20個文件...」,說「合併20個文件...」更爲正確。至於合併,我從來沒有提到要進行雙向合併。這將是非常低效的。在這種情況下,最有效的方法是在對單個文件進行排序後進行4000路合併。這將最大限度地減少I/O時間。但是,如果速度不是最高優先級,那麼按照您的建議進行拆分就具有實際意義。 –
你使用什麼排序算法?因爲我認爲問題在於算法;您需要查看更有效的算法來進行排序。我相信對於大量輸入,合併排序是最好的(儘管對這個尺寸只做了一些修改)。
Here是一個非常相似的問題,看看前兩個答案。他們應該幫助你解決問題。
最簡單的解決方案是;爲堆大小添加更多內存。 8 GB並不多。我9歲,有一臺我的舊機器,有24 GB。 –
XML?賈森?純文本? – efekctive
其plaint文本 – sweep