【发布时间】:2014-12-28 18:29:29
【问题描述】:
我有一个应用程序,其中发生了很多文件 I/O(读取和写入)。我知道使用多个线程来执行文件 I/O 不是一个好的解决方案,因为它会降低性能(我无法控制所使用的磁盘类型)。所以我最终为所有文件 I/O 指定了一个线程。 MappedByteBuffer 在我的情况下可以使用吗?我知道 MappedByteBuffer 是一个由操作系统映射到文件的内存区域,我可以利用多个线程有效地对不同的内存映射缓冲区进行 I/O 操作吗?当多个线程将不同的文件映射到不同的内存缓冲区时,磁盘磁头寻道时间是否仍然重要?在这种情况下是否保证一致性?是否有适用于此类情况的基准测试结果?提前谢谢大家。
【问题讨论】:
-
“我知道使用多线程来做文件I/O不是一个好的解决方案,因为它会降低性能”这是基于什么?
-
磁盘的磁头需要不断寻找下一个要读取的位置,当多个线程这样做时,磁头会在不同的磁盘区域之间低效地弹跳。
-
@skytreader 感谢您指出这一点,我应该在描述中使用“MappedByteBuffer”。
-
我可能会找到很多说它更好的东西,比如这个stackoverflow.com/a/1239987/360211 关键是不要接受任何人的说法和个人资料。个人经验是,它提高了整体吞吐量,不仅仅是磁头寻道时间,还涉及其他延迟,这些延迟在并行完成时会被最小化。
-
唯一可以肯定地说的是“这取决于”。内存映射文件在某些情况下确实有一些优势——在其他情况下它们会花费你的时间。在某种程度上也相关:ibm.com/developerworks/java/library/j-zerocopy 关于较少上下文切换的部分也应该适用于内存映射文件。如果您想为您的用例找到正确的答案,请实施所有方法、配置文件和优化,直到获得最佳答案。
标签: java multithreading file-io memory-mapped-files