java映射FileChannel实现

时间:2012-12-16 04:35:11

标签: java performance memory-mapped-files

使用Mapped FileChannel阅读文件似乎闪电般快......但我想知道他们是如何做到的?

他们只是在一个大的(~64kB)缓冲区中阅读,然后让我继续前进吗?或者还有更多吗?

我对速度印象深刻,并希望更好地理解它背后的算法。

2 个答案:

答案 0 :(得分:2)

在你这样做之前,他们不读任何东西,然后你读的那篇文章基本上是通过OS分页系统读取的。 open可能会花费你几乎没有,但重复读取同一块文件可能会导致重复的I / O.没有什么是免费的。

答案 1 :(得分:1)

内存映射,将文件映射到内存中,Java提供了一个库来包装它,以便您可以相对安全地访问它。

它的好处包括:

  • 内存,操作系统磁盘缓存和应用程序内存中只有一个副本。
  • 您无需系统调用即可访问文件的随机区域。
  • Java确实限制了您可以映射的数量。即,如果您的最大堆数为1 GB且最大直接内存为1 GB,则仍可以以1 TB映射。

它的缺点包括:

  • 它会消耗虚拟内存,如果您重新映射或关闭文件,它将不会返回。如果你有一个64位的JVM,这不是一个问题,但如果你有一个可能只有1 GB空闲的32位JVM,那么这个问题非常有限。它在GC运行时释放虚拟内存。
  • 一次读取/写入最少页面。如果您有大量随机访问权限,但如果您正在读取/写入磁盘上的许多文件,则实际上会降低顺序访问速度。一次随机附加4KB文件会导致高度碎片文件,这是不明白的。
  • 使用普通的DataXxxxStream或BufferedReader / Writer处理内存映射文件会更加困难。

我已经编写了几个库,使内存映射文件更易于使用,我会说当超低延迟至关重要或者您需要读取大量内存(您希望在磁盘缓存中)时我会使用它已经,你想充分利用你的磁盘缓存。

值得注意的是,内存映射不会使您的磁盘子系统更快,如果这是您的限制因素,那么读取/写入数据的方式无关紧要。