我在想如何在我的程序中使用線程。 現在我有一個單線程程序讀取一個巨大的文件。非常簡單的程序,只需逐行閱讀並收集有關單詞的一些統計信息。 現在,我想使用多線程使其更快。我不知道如何解決這個問題。在Java中使用多線程來讀取數據
一種解決方案是預先將數據分成X塊,然後有X個線程,每個線程同時運行一個塊,使用一種同步方法將統計信息寫入內存。有更好的方法嗎?具體來說,我想避免提前分離數據。
謝謝!
我在想如何在我的程序中使用線程。 現在我有一個單線程程序讀取一個巨大的文件。非常簡單的程序,只需逐行閱讀並收集有關單詞的一些統計信息。 現在,我想使用多線程使其更快。我不知道如何解決這個問題。在Java中使用多線程來讀取數據
一種解決方案是預先將數據分成X塊,然後有X個線程,每個線程同時運行一個塊,使用一種同步方法將統計信息寫入內存。有更好的方法嗎?具體來說,我想避免提前分離數據。
謝謝!
首先,執行一些分析以確保您的進程實際上是計算綁定的,而不是I/O綁定的。也就是說,您的統計信息收集比訪問文件慢。否則,多線程將緩慢您的程序,而不是加快它,特別是如果您在單核CPU(或古老的JVM)上運行。
另請考慮:如果您的文件駐留在硬盤上:您將如何安排讀取?否則,您可能會冒險增加硬盤尋道延遲,否則會拖延所有設法完成其大塊工作的線程,同時一個線程要求硬盤尋求位置0x03457000 ...
+1我不得不以艱難的方式找到它。 I/O綁定進程並不總是多線程友好的,實際上可能會比單線程I/O的性能低。 IMO使用緩衝讀/寫通常會加速基於磁盤的I/O。 – Elister 2010-03-02 12:22:57
+1:它永不停止成真 - 先測量,然後優化。 – 2010-03-02 12:24:20
您可以查看producer-consumer做法。這是一個傳統的線程問題,其中一個線程產生數據(在你的情況下是讀取文件的數據),並將其寫入到另一個線程讀取數據(消費者)(這是你的計算線程(某些Java examples))的共享緩衝區。
也看看Javas non-blocking IO。
的假設,即多線程的磁盤訪問速度更快可能是錯誤的,因爲這裏disguessed:Directory walker on modern operating systems slower when it's multi-threaded?
性能改進可以通過在單獨的線程數據的分割讀取和處理來實現。
但是等一下,逐行讀取文件?這聽起來並不理想。更好地將它們讀爲字符流(使用FileReader
)。
,如果你的問題是I/O密集型,也許你可以考慮你的數據分割成多個文件,並把它變成一個分佈式文件系統,比如Hadoop的文件系統(HDFS),然後運行上的Map/Reduce操作它?
這是一個不錯的選擇。謝謝。 – user247866 2010-03-02 17:12:04
你的文件有多大?你的機器配置是多少? – portoalet 2010-03-02 14:23:23