2015-01-13 24 views
1

如果我有一个使用FileChannel的I/O线程,我应该有一个方法需要一个值,填充一个缓冲区并将其写入磁盘,或者我应该有一个有限的队列和一个将块写入磁盘的缓存代替?I/O线程的直接切换或阻塞队列?

这些数值相当小,而且会有很多数据,所以从性能的角度来看,我应该为FileChannel做一个包装,使其与BufferedWriter相似?或者是直接切换并写入好吗?

回答

1

如果非要使用FileChannel一个I/O线,应该我有取值,填充缓冲器,并将其写入到磁盘上的方法,或我应该有一个有界队列写入的高速缓存阻止磁盘而不是?

取决于您的应用程序的特点。如果您正在对信息进行一些处理,那么您可能会受到处理器的限制,因此要分割一个线程以便将IO传送到FileChannel,而从有界的BlockingQueue消耗将是一个好主意。但是CPU速度仍然极大地影响了IO,因此多线程的复杂性可能不是明显的胜利。

如果确实使用BlockingQueue,请确保限制其大小,否则生产者可能会填充内存(如果生成速度比写者快)。

这些值是相当小的,并且会有很多,所以从性能的角度来看,我应该为FileChannel制作一个包装来使其与BufferedWriter相似?

是的。鉴于每个值都很小,每写一个FileChannel IO操作将会很昂贵。缓冲一些值,然后将它们作为块应该给你一个很好的性能增加。当然值得编写缓冲区并进行测试。