2016-01-20 54 views
0

我想知道是否有一種方法來優化從Java中的磁盤讀取。我的意思是,例如,我想在某個目錄中打印所有文本文件的包含,但在大寫後打印。我可以創建另一個線程大寫他們,但我可以通過添加另一個(線程)讀取文件來優化閱讀嗎?我的意思是2,3或更多線程從磁盤讀取差異文件。有沒有這樣做的優化?我希望我能清楚地解釋這個問題。可以從差異線程讀取磁盤優化程序?

+0

你爲什麼不實施,嘗試和博客,以便我們可以從你的發現中學習呢? –

回答

2

我要打印包含的所有文本文件

這很可能是你的瓶頸。如果沒有,你應該關注你的瓶頸,因爲優化其他任何東西都可能使你的代碼複雜化,而沒有任何好處。

我可以創建另一個線程做大寫他們,

可以,但經過工作到另一個線程可能會比使得它取決於你是如何做到這一點大寫更加昂貴。

我可以優化由增加另一個(線程(S))來讀取文件太閱讀?

可能。你有多少個磁盤。如果你有一個磁盤,一次只能做一件事。

我的意思是2,3或更多線程從磁盤讀取差異文件。

大多數桌面驅動器一次只能執行一項操作。

有沒有這樣做的一些優化或沒有?

是的,但正如我所說,直到你知道你的瓶頸是什麼,很難跳到解決方案。

+0

非常感謝。這是我最需要的東西大多數桌面驅動器一次只能執行一項操作。其他條件僅僅是例如 - 我不想完全打印一些東西給控制檯。我只有一個驅動器。我忘記提及這一點。我只是不知道硬盤的硬件限制。 – DPM

+0

@DPM服務器/企業級驅動器可以從一次給予多個請求中受益,儘管它不會使磁盤快速旋轉。 –

0

我可以創建另一個線程做大寫他們

這實際上是朝着正確的方向發展,但只是使所有的字母,除非你真的處理大大寫不採取足夠的時間來真正的問題文件的大塊。

由於標準的單線程模型的read-then-process意味着您要麼正在讀取數據,要麼正在處理它,因爲您可以同時執行這兩個操作。

例如,您可能會從大型視頻流文件中創建一系列高度壓縮的圖像(比如JPEG2000,因爲它佔用的CPU太多)。您可以讓一個線程從流中讀取幀,將它們放入一個隊列中進行處理,然後每個線程將一個幀處理爲一個圖像。

您會調整讀取數據的線程數和處理數據的線程數,以使您的磁盤和CPU儘可能最大程度地忙碌而不會出現過多爭用。

在某些情況下,您可以使用多個線程從單個文件讀取以獲得更好的性能。但是你需要一個從頭開始設計的系統來做到這一點。你需要大量的磁盤(如果它們是固態硬盤的話,更少),相當可觀的IO基礎設施以及具有很多IO帶寬的系統,然後你需要一個能夠同時處理多個文件的文件系統。然後,您必須編寫的代碼才能通過使用多個線程來獲得更好的性能,這需要與磁盤上的文件的物理佈局相匹配。

如果您從遍佈多個設備的文件中進行大量隨機讀取,那麼效果最佳。就像一個大型的高性能數據庫服務器一樣。

例如,假設我有一個龐大的數據文件分佈在四個或五個磁盤(甚至是RAID陣列)上,並且文件以64KB的塊分佈在磁盤上。少數幾個線程執行64KB讀操作將是讀取或寫入隨機訪問模式下的文件的理想選擇。假設一切都非常快,您可以從這樣的文件讀取或寫入1 GB /秒。

但是如果你轉過身來試着在流中複製這些數據,你仍然可以使用多個線程來獲得最大性能 - 比如說1 GB /秒 - 但是如果你只用一個線程去做read()調用1 MB大塊可能會達到950 MB /秒 - 或95%或最大多線程讀取性能。

我實際上已經對這樣的系統進行了基準測試,大多數時候,多線程IO不值得麻煩,除非您在硬件和軟件上投入了大量資金(開源文件系統往往不會很好地完成這項工作 - 您需要進入IBM的GPFS和Oracle(即LS的後續Sun的QFS)的領域,並且您在設置時確切知道自己在做什麼。