我有一個程序,其中每個線程一次從文件中讀取多個文件,處理這些行,並將這些行寫入另一個文件。四個線程拆分文件列表以在其中進行處理。我有奇怪的性能問題,在兩個情況:Java文件I/O吞吐量下降
- 四個文件與50,000行每
- 吞吐量開始於處理700行/秒,下降到約100行/秒
- 30000名的文件與12行,每行
- 吞吐量最低大約800行/秒和保持穩定
這是內部軟件我工作所以很遺憾我不能共享任何源代碼,但該方案的主要步驟是:在四個工作線程文件
- 拆分列表
- 啓動所有主題。
- 線程一次讀取最多100行,並存儲在
String[]
數組中。 - 線程將轉換應用於數組中的所有行。
- 線程將行寫入文件(與輸入文件不同)。
- 每個線程重複3-5次,直到所有文件完全處理完畢。
我不明白的是爲什麼每行有12行的30k文件比起每行有很多行的幾個文件給了我更多的性能。我會期望打開和關閉文件的開銷要大於讀取單個文件的開銷。另外,前一種情況的表現下降是指數性的。
我已經設置了最大堆大小爲1024 MB,它似乎最多使用100 MB,所以過載GC不是問題。你還有其他建議嗎?
我會嘗試重新編碼它,以便主線程一次讀取多行,允許多個工作線程處理,然後主線程再次將結果寫出。謝謝! – 2010-07-06 21:33:52