我有30個gb文件,其中只有1至1000個數字是重複的。我想知道如何對文件進行排序,並且需要先將文件加載到內存中。如何對30gb文件進行排序重複有1至1000個數字
我已經通過其他的鏈接,但不同意排序多個文件塊並將其保存在臨時文件中。正如我相信在流程結束時,我將剩下兩個大文件(每個15 GB)進行排序。我無法加載每個合併和排序。
有什麼建議嗎?
我有30個gb文件,其中只有1至1000個數字是重複的。我想知道如何對文件進行排序,並且需要先將文件加載到內存中。如何對30gb文件進行排序重複有1至1000個數字
我已經通過其他的鏈接,但不同意排序多個文件塊並將其保存在臨時文件中。正如我相信在流程結束時,我將剩下兩個大文件(每個15 GB)進行排序。我無法加載每個合併和排序。
有什麼建議嗎?
鑑於數值都在1..1000範圍內,您可以使用簡單版本Counting Sort來完成此操作。
counters[1000]
陣列(1001如果陣列是從零開始 )全部初始化爲0。counters[n]
中讀取值n
時。counters
,對於每個索引n
寫counters[n]
副本n
來輸出。例如,如果counters[100] == 5
則編寫100
以輸出5
次。您不需要將整個文件保存在內存中。您只需要計算每個值出現在文件中的次數。這是創建原始文件的排序版本的足夠信息。
如果您確實需要對完整列表進行排序,這是最好的選擇。如果一個近似值會做,你可以取而代之,並在次線性時間內得到答案。 – Dave
@Blastfurnace,當我必須讀取文件時出現問題 - 記住它的30GB –
@AnilPurswani:您不需要將整個文件加載到內存中。只需按順序讀取文件,更新數量。然後你可以用排序值重寫文件。 – Blastfurnace
您是否需要使用合併排序?這可以通過計數排序在線性時間內完成。 – Blastfurnace
@Blastfurnace,沒有這種使用合併排序的要求 –