2011-08-24 84 views
6

我正在使用BufferReader.readlLine()逐行處理大量文本文件。BufferedReader性能低下

兩個大小相同的文件130MB,但一個需要40秒才能處理,而其他需要75秒。

我注意到一個文件有180萬行,而其他文件有210萬。但是當我試圖處理一個具有相同大小的300萬行的文件時,需要30分鐘來處理。

所以我的問題是:

  1. 這種行爲是因爲尋求緩衝讀者的時間(我想知道如何BufferedReader作品或線分析文件行?)

  2. 有我可以用更快的方式逐行讀取文件的任何方式?

好的朋友,我提供了一些更多的細節。我使用正則表達式將行分成三部分,然後使用SimpleUnsortedWriter(由Cassandra提供)我將它作爲鍵,列和值寫入某個文件。處理16MB數據後,它將刷新到磁盤。

但是處理邏輯對於所有文件都是一樣的,即使是一個大小爲330MB的文件,但是在100萬個左右的行中沒有更少的文件在30秒內得到處理。可能是什麼原因?

deviceWriter = new SSTableSimpleUnsortedWriter(
     directory, 
     keyspace, 
     "Devices", 
     UTF8Type.instance, 
     null, 
     16); 

Pattern pattern = Pattern.compile("[\\[,\\]]"); 
while ((line = br.readLine()) != null)   
{ 
    //split the line i n row column and value 
    long timestamp = System.currentTimeMillis() * 1000; 
    deviceWriter .newRow(bytes(rowKey)); 
    deviceWriter .addColumn(bytes(colmName), bytes(value), timestamp); 

} 

物是人非-Xmx256M to -Xmx 1024M但不反正幫助。根據我的觀察,當我正在寫入緩衝區(在物理內存中)時,作爲第一個物理內存。寫入緩衝區的次數越來越多,新的寫入需要時間。 (這是我的猜測)

請回復。

+3

請張貼您使用BufferReader的代碼 – razlebe

+1

也許它不必與BufferedReader一起使用,而是使用每行處理。 – Marcelo

回答

6

唯一BufferedReader沒有從根本Reader讀入內部char[]緩衝區8K的默認大小,所有的方法對緩衝區的工作,直到它已經用盡了,此時從底層的Reader中讀取了另外的8K(或其他)。 readLine()是加固。

正確使用BufferedReader肯定應該是而不是導致運行時間從1.8m線上的40秒上升到3m線上的30分鐘。你的代碼一定有問題。顯示給我們。

另一種可能性是您的JVM沒有足夠的堆內存,並且30分鐘內大部分時間都在進行垃圾回收,因爲它的堆已滿99%,並且最終會得到一個輸入較大的OutOfMemoryError。你在處理的線條上做什麼?他們是否在記憶中?使用-Xmx 1024M命令行選項運行程序是否有所作爲?

+0

嘿謝謝...提供了一些關於我的問題的更多細節請通過 – samarth

+0

@samarth:我沒有看到你發佈的代碼有什麼問題。最簡單的解決方案可能是用VisualVM做一些簡單的分析。這應該告訴你所有的時間都花在哪裏,這可能會直接導致你直接導致問題的原因。 –

1

BufferedReader不會尋找,它只是緩存字符,直到找到換行符並將該行作爲字符串返回,並在每行之後丟棄(重新使用)緩衝區。這就是爲什麼你可以使用它與任何流或其他讀者,即使那些不支持尋求。

因此,單獨行數不應該在讀者級別造成如此大的差異。然而,很長的一行可能會創建一個非常大的字符串並分配大量的RAM,但這似乎不是您的情況(在這種情況下,它可能會因GC時間過長或類似情況而導致OutOfMemory異常)。

對於我在代碼中可以看到的內容,您沒有做錯任何事情。我想你正在碰到某種限制,因爲它似乎不是RAM,也許它與Cassandra方面的一些硬性限制有關?你有沒有試過評論Cassandra上寫的部分?只是爲了看看是你的身邊還是Cassandra身邊造成的問題。

+0

嘿謝謝...提供了一些關於我的問題的更多細節,請通過 – samarth

+0

查看你的代碼後編輯答案。 –

1

BufferedReader可能不是您的性能問題的根源。

根據您引用的數字,聽起來您的代碼中存在一些二次複雜性。例如,對於您閱讀的每一行,您都重新檢查您之前閱讀過的每一行。我只是在這裏進行推測,但這個問題的一個常見例子是使用列表數據結構,並檢查新行是否與之前的行匹配。

+0

嘿謝謝...提供了一些關於我的問題的更多細節請通過 – samarth