2010-07-28 104 views
-1

我有多個文本文件,代表日誌條目,我需要稍後解析。每個文件的大小高達1M,我有大約10個文件。 的每一行都具有以下格式:根據時間戳排序+合併多個文件的行

Timestamp\tData 

我必須合併所有文件和時間戳值的條目進行排序。無法保證1個文件的條目按照時間順序排列。

什麼是最聰明的方法?我Pseudo'd代碼如下所示:

List<FileEntry> oneBigList = new ArrayList<FileEntry>(); 
for each file { 
    parse each line into an instance of FileEntry; 
    add the instance to oneBigList; 
} 
Collections.sort(oneBigList according to FileEntry.getTimestamp()); 

回答

2

如果您不知道,您的任務將適合可用內存,你最好解析成一個數據庫表後插入你的線條,並有關於如何數據庫憂要訂購數據(時間戳列上的索引將有助於:-)

如果您確定內存沒有問題,那麼我會使用TreeMap進行排序,同時向它添加行。

確保您的FileEntry類根據您的排序順序執行hashCode()equals()Comparable

+1

yup,對於每個1MB的10個文件,樹圖應該足夠多。實際上,TreeSet,因爲不需要地圖功能,是嗎? – 2010-07-28 09:24:28

+0

如果你不需要查找訪問'TreeSet'會很好,是的。 – rsp 2010-07-28 09:47:11

+0

我使用了TreeSet方法,它工作正常。小型基準測試顯示,Collections.sort()和TreeSet(分別爲151ms和170ms)(每種方法10次嘗試的平均值)與150k測試數據(包括文件打開+閱讀) – f1sh 2010-07-28 10:05:42

0

在每個文件中,您可以假定條目是按照時間排序的,因爲「下一行」是在「上一行」之後寫入的。

這意味着你應該實現合併排序。最好合並排序兩個最小的文件到對方,然後重複,直到你有一個文件。

請注意,如果這些文件來自多臺機器,您仍然將無序登錄;因爲除非機器時鐘通過一些可靠的手段同步,否則時鐘將有所不同。即使它們同步,時鐘也會有所不同;然而,他們可能會有所不同,但數量可能並不重要。

合併排序不是最快的排序;然而,它有一些非常有益的副作用。也就是說,它可以針對每對文件並行執行,並且它比不假定順序的排序快得多,它對內存消耗很友好,並且可以在兩個文件合併的末尾輕鬆檢查點。這意味着您可以從中斷的排序會話中恢復,但只會失去部分工作量。

相關問題