我有一個文件,可能是30 + GB或更多。並且在該文件中的每一行被稱爲一個記錄並且由2 COLS,這是這樣的有效刪除所有重複記錄
ID1 ID2
這2個id的所有爲整數(32位)。我的工作是編寫一個程序來刪除所有重複記錄,使記錄具有唯一性,最後將唯一的id2輸出到文件中。
有一些限制,30G內存被允許最多,更好地把工作由非多線程/進程程序高效地完成。
最初我想出了一個主意:由於內存的限制,我決定讀取文件n次,每次只記錄那些記錄與id1 % n = i (i = 0,1,2,..,n-1)
。我使用的數據結構是std::map<int, std::set<int> >
,它將id1作爲關鍵字,並將id2放在id1的std::set
中。
這樣,內存約束不會被違反,但它很慢。我認爲這是因爲隨着std::map
和std::set
變大,插入速度下降。此外,我需要讀取文件n次,每輪完成後,我必須清除下一輪的std::map
,這也需要一些時間。
我也試過哈希,但它並不滿足我要麼,我想可能有太多的衝突甚至300W桶。
所以,我在這裏發佈我的問題,幫助你們爲我提供更好的數據結構或算法。
非常感謝。
PS
腳本(殼,蟒)是期望的,如果它能夠有效地做到這一點。
你必須做它作爲一個C++程序?你不能在shell上使用類似'sort'和'uniq'(假設Linux)的工具嗎? – jogojapan
@jogojapan,是的,如果它是有效的。 – Alcott
重複定義爲兩個列中的_identical,或者第一列中的_identical only_? – jogojapan