2009-05-28 57 views
3

我正在處理許多GB的文本數據,我想知道是否有一種方法來提高性能。例如,當處理10千兆字節的數據並且根本不處理它時,只需逐行迭代,大約需要3分鐘。改進BufferedReader速度

基本上我有一個dataIterator包裝器包含一個BufferedReader。我不斷地調用這個迭代器,它返回下一行。

問題是創建字符串的數量?或者可能是函數調用的次數。我真的不知道如何配置這個應用程序,因爲它被編譯爲jar並用作STAF服務。

任何和所有的想法讚賞?

回答

6

讓我們從基礎開始:您的應用程序是I/O綁定的。由於對象分配,內存或CPU限制,您的性能不會受到影響。由於磁盤訪問,您的應用程序運行緩慢。

如果您認爲可以改進文件訪問,則可能需要使用JNI進行低級編程。如果您自己更有效地處理文件,則可以提高文件訪問權限,並且需要在較低級別上完成。

我不確定使用java.nio會爲您尋找更好的性能,儘管它可能會讓您在運行I/O時執行CPU /內存密集型操作時更加自由。

原因是基本上,java.nio用選擇器包裝文件讀取,讓您在讀取緩衝區時使用通知,確實爲您提供異步行爲,這可能會有助於您的性能。但閱讀文件本身是你的瓶頸,java.nio不給你在這方面的任何東西。

所以先試一下,但我不會讓我的希望太高。

+3

真相。 3分鐘內10GB爲55MB /秒。這接近了基於磁盤的磁盤驅動器的傳統讀取性能。如果沒有基於RAM的驅動器,你可能會在一個非常好的情況下增加一倍或三倍,就是這樣。 – Jherico 2009-05-28 18:51:32

+0

Jherico>或「添加索引」或類似內容。 – 2009-05-28 19:03:01

+0

我不關注。如果你有IO界限,索引如何幫助你?它聽起來不像是搜索就是應用程序,更像是日誌處理或索引,您只需要按順序瀏覽數據。 – Jherico 2009-05-28 19:33:48

3

我認爲Java's NIO package將非常有用您的需求。

This Wikipedia article對「舊」Java I/O的具體改進有一些很好的背景信息。

+0

我會試試看。 – esiegel 2009-05-28 18:40:17

+0

不確定使用NIO將有助於讀取性能本身。如果通過映射文件來讀取,它可能會間接幫助* - 它應該停止從操作系統文件緩存中讀取數據。 – 2009-05-28 20:18:12

0

如果程序通過常規「java -options ... ClassName args ...」命令行啓動,則可以對其進行配置。我最熟悉NetBeans Profiler。它有一種方法來分別啓動Java應用程序(adding a java option to the startup),然後連接分析器。

如果您嘗試優化而不測量需要改進的部分,那麼您就是在黑暗中工作。你可能會很幸運,或者你可能會花很多時間做無關緊要的工作。

+0

我將STAF服務編譯成一個JAR,然後STAF被調用併合並了jar文件。我試着用Jconsole查看它,但由於某種原因,我無法連接。我在STAF論壇上發佈了這個問題,但他們沒有太多幫助。 – esiegel 2009-05-28 20:04:18

1

使用NIO,通道,字節緩衝區和內存映射文件將爲您提供最佳性能。這與您將要獲得的硬件差不多。我有一個類似的問題,我不得不解析超過600萬個分隔的文本行(265MB文件),然後繞着行中的分隔列移動,然後將其寫回。使用NIO和2002硬件需要33秒。訣竅是將數據保留爲字節。您有一個線程讀取數據以提取該行,另一個線程處理該行,第三個線程將其寫回。