I/O 线程的直接切换或阻塞队列?

Direct Handoff or BlockingQueue for I/O Threads?

如果我有一个使用 FileChannel 的 I/O 线程,我应该有一个获取值、填充缓冲区并将其写入磁盘的方法,还是应该有一个有界队列使用将块写入磁盘的缓存?

这些值相当小,而且会有很多,所以从性能的角度来看,我是否应该为 FileChannel 制作一个包装器以使其类似于 BufferedWriter ?还是直接handoff写ok?

If I have an I/O thread using a FileChannel, should I have a method that takes a value, fills a buffer and writes it to the disk, or should I have a bounded queue with a cache that writes blocks to the disk instead?

在一定程度上取决于您的应用程序的特性。如果您正在对信息进行一些处理,那么您可能会受到处理器限制,因此分叉一个线程只对 FileChannel 执行 IO,同时从有界的 BlockingQueue 中消费将是一个好主意。但是 CPU 速度仍然大大超过 IO,因此多线程的复杂性可能不是一个明显的胜利。

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

The values are rather small, and there is going to be a lot of them, so from a performance standpoint, should I make a wrapper for the FileChannel to make it similar to BufferedWriter?

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