2010-08-27 115 views
0

我想讀一個非常大的文本文件(一個Web應用程序的日誌文件)並做一些處理。在Java中讀取和處理大文本文件?

有沒有任何框架來幫助做這樣的工作?

該文件是100M +,我應該使用mutil-thread?

問候

+0

可能重複[在Java中讀取大文件](http://stackoverflow.com/questions/2356137/read-large-files-in-java) – fglez 2013-04-10 08:58:09

回答

3

在你的情況下,多線程並沒有太大的幫助,因爲問題是I/O綁定而不是CPU綁定(當然,除非你試圖對內存中的文本文件進行大量處理,然後將其寫回)。如果關心的是讀取文件,通常100 MB是大型系統可以處理的。如果這是文件的大小,並且您在Unix機器上運行,請查看您是否可以在64位虛擬機下運行代碼。當然,這不是一個永久的解決方案。

一個可擴展的解決方案是讓您逐行讀取文件,並只保留您想要的數據,並最終單獨處理該數據(假設您可以執行脫機處理)。 Little Bobby Tables的方法很好,因爲它給你一個持續的處理時間(實際上它將是O(n),其中n是要處理的行數)。

+0

謝謝!我學到了很多 – idiotgenius 2010-09-07 13:37:31

2

如果該文件是非常大的,你要處理它作爲一個整體(而不僅僅是用grep顯示它,或做行明智處理)有你用完了RAM內存的風險(或者至少會導致你的記憶混亂)。

更強大的解決方案是將文件逐行解析,將其存儲到某個磁盤上的隨機訪問應用程序(數據庫),然後使用此應用程序執行處理。

由於您使用磁盤,它會降低處理速度,但它會確保性能級別保持不變,而不管文件大小如何。

0

根據您的需要,最有效的解決方案可能是啓動一個外部程序,用於執行此類工作,例如perl,grep或awk,然後告訴它要做什麼,然後對結果進行後處理。

1

Hadoop非常適合這個:http://hadoop.apache.org/ - 它可以處理線程,分發到不同的機器,在文本輸入等方面有很多功能。map-reduce範例有點不同,但是肯定會考慮這一點。

1

我最近寫了一個300M +日誌文件的日誌分析器。 我使用Apache Commons IO LineIterator類進行罰款(20秒)

對於不太IO不需要先解壓縮文件,但使用 new InputStreamReader(new GZIPInputStream(new FileInputStream(logFile)), "US-ASCII");作爲輸入讀卡器。