2011-04-20 48 views
1

我需要合併大約30個gzip-ed文本文件,每個文件大約壓縮10-15GB,每個文件包含多行記錄,每個記錄都由同一個鍵排序。這些文件駐留在NFS共享中,我可以從多個節點訪問它們,並且每個節點都有自己的/tmp文件系統。最快的方法是什麼?有效合併排序文件

一些可能的解決方案:

A.一切交給sort -m。要做到這一點,我需要通過awk/sed/grep傳遞每個輸入文件,將每條記錄摺疊成一行,並提取一個sort可以理解的密鑰。所以,我會得到類似

sort -m -k [...] <(preprocess file1) [...] <(preprocess filen) | postprocess

B.瞧到蟒的heapq.merge。 C.編寫我自己的C代碼來做到這一點。我可以合併在小批量的文件,使一個OMP線程每個輸入文件,一個用於輸出,和一個實際上做在RAM中的合併等

選項上述所有的:

d 。在比賽中一次合併幾個文件。 E.爲此使用多個節點,在節點之間複製中間結果。

你會推薦什麼?我對二級存儲效率並沒有太多經驗,因此,我很難估計其中的哪一個會發揮作用。

+0

你有沒有考慮過將問題更接近它起源的地方?例如。如果您的文本文件是面向行而不是面向記錄(多行),那麼您可以在不進行預處理的情況下執行合併排序。 – Jens 2011-08-26 12:25:44

回答

2

如果你去涉及heapq.merge解決方案B,那麼你會很高興知道的是Python 3.5將根據docs.python.orgbugs.python.orggithub.com添加key參數heapq.merge()。這將是您的問題的一個很好的解決方案。