【问题标题】:Why is a FileChannel performing better than MemoryMappedBuffer?为什么 FileChannel 的性能比 MemoryMappedBuffer 好?
【发布时间】:2016-11-09 15:37:52
【问题描述】:

我正在使用多个线程读取一个 50 GB 的文件(只读),每个线程从文件中读取一个顺序段。我尝试了两种方法

  • 使用文件通道
  • 使用从 FileChannel 获得的 MemoryMappedBuffer

我原本期望 MemoryMappedBuffer 的性能优于 FileChannel,但 FileChannel 的性能持续提高了大约 30%。

我正在寻找解释。 我一次映射 1 GB 的内存,一旦用完,我会映射另一个 1 GB。

我的环境:Windows 7 平台 64 位至强 2.7 ghz 2 处理器

【问题讨论】:

  • Windows 7 平台 64 位至强 2.7 ghz 2 处理器
  • 你有多少内存?如果你没有超过 50GB,FileChannel 应该更快(比使用虚拟内存)。
  • 读取整个 50 gigs 文件的目的是什么?你不能部分处理它,让它适合你的内存吗?
  • 32 GB 内存,但只有 20 个可用
  • @walkeros 我正在测试一种尽快读取此文件的方法

标签: java nio memory-mapping


【解决方案1】:

两种变体都必须执行相同的磁盘 I/O。两者都将从磁盘读取的页面缓存在内存中。内存映射有一些页面错误开销。那么,假设要读入大量物理内存,您为什么期望它会更快呢?

【讨论】:

  • 没错,内存缓冲区只是更多的开销(如果开销相对较小)。
  • 同意,但为什么 MemoryMappedBuffer 速度较慢?
  • 我想我是说页面错误开销约为 30% 似乎有点多
  • 好吧,您需要一位 Windows 专家才能到达现场。
猜你喜欢
  • 2021-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 2014-08-02
  • 2019-04-15
相关资源
最近更新 更多