2015-01-13 23 views
1

如果我有一個使用FileChannel的I/O線程,我應該有一個方法需要一個值,填充一個緩衝區並將其寫入磁盤,或者我應該有一個有限的隊列和一個將塊寫入磁盤的緩存代替?I/O線程的直接切換或阻塞隊列?

這些數值相當小,而且會有很多數據,所以從性能的角度來看,我應該爲FileChannel做一個包裝,使其與BufferedWriter相似?或者是直接切換並寫入好嗎?

回答

1

如果非要使用FileChannel一個I/O線,應該我有取值,填充緩衝器,並將其寫入到磁盤上的方法,或我應該有一個有界隊列寫入的高速緩存阻止磁盤而不是?

取決於您的應用程序的特點。如果您正在對信息進行一些處理,那麼您可能會受到處理器的限制,因此要分割一個線程以便將IO傳送到FileChannel,而從有界的BlockingQueue消耗將是一個好主意。但是CPU速度仍然極大地影響了IO,因此多線程的複雜性可能不是明顯的勝利。

如果確實使用BlockingQueue,請確保限制其大小,否則生產者可能會填充內存(如果生成速度比寫者快)。

這些值是相當小的,並且會有很多,所以從性能的角度來看,我應該爲FileChannel製作一個包裝來使其與BufferedWriter相似?

是的。鑑於每個值都很小,每寫一個FileChannel IO操作將會很昂貴。緩衝一些值,然後將它們作爲塊應該給你一個很好的性能增加。當然值得編寫緩衝區並進行測試。