Java - 内存映射文件的好处

时间:2014-02-18 17:13:45

标签: java nio memory-mapped-files

我很难在Java中看到内存映射文件(缓冲区)的好处。这是我在实践中看到的方法:

我们将文件块映射到主内存中,直接处理内存中的任何写入/读取,让操作系统将文件保存到磁盘中。

现在,我想将其与常规I / O和一些场景进行对比:

  1. 附加到文件
  2. 为了将文件映射到mem,我必须将其作为一个整体阅读,以进行整体修改。缓冲区大小最初是文件的大小(让我们说我不知道​​我要写入文件的数据量)。现在,为了附加到文件,我不能这样做,因为缓冲区的大小有限。所以最基本的操作对我来说似乎不可能。另外,读取整个文件以附加一小部分似乎相当浪费。所以我认为常规I / O在这种情况下表现更好。

    1. 坚持改变
    2. 为了保持更改,我仍然需要刷新它们。因此,如果我不定期这样做,我可能会丢失主内存中的更改。这与常规I / O流的想法相同,因此这里也没有增益。

      1. 随机更改
      2. 这是我可以看到它工作的地方 - 用其他n个字节替换n个字节。尽管如此,将m个字符替换为m个字符似乎相当不寻常。我们希望Hello并将其替换为Hi。但是我们有一个填充的,固定大小的缓冲区,所以这并不容易......此外,它让我想起RandomAccessFile具有更好的性能。

        我写的大部分内容可能都是胡说八道,但我很乐意被告知,至于我,MemoryMappedBuffer似乎很难,甚至不可能使用。

3 个答案:

答案 0 :(得分:5)

内存映射文件的好处

  • 它们是 IPC (过程互通)的一种手段,非常快
  • 您不必使用慢速系统调用,例如openreadwrite(它们非常慢,因为cpu具有如果您正在呼叫系统调用,请执行上下文切换
  • 您可以使用非常干净的界面:写入主内存。这很容易,人们知道如何使用它
  • 没有浪费磁盘I / O ,所有修改都在RAM中完成。首先,其他进程可以更好地利用磁盘,而另一个进程可以增加SSD的耐用性,其覆盖范围有限,直到它不存在
  • 无论如何,
  • 随机访问更快,因为RAM “随机存取内存”并且是为此而构建的

然而,一个缺点是应该不时地将内存映射保存回磁盘。想象一下,你自己在RAM中进行了一些高度复杂的操作几个小时,突然之间出现了黑屏 - 所有信息都丢失了。

答案 1 :(得分:2)

在Java中使用内存映射文件有许多优点。其中一些是:

  • 非常快速的IO操作
  • 在两个进程之间共享数据
  • 操作系统执行实际的读/写操作。

除了上述内容之外,java.nio Java的内存映射文件功能带来的最大缺点是,如果请求页面不在RAM中,则会导致页面错误。因此,如果您在文件中间进行一些初始读/写操作后进行追加,则可能导致页面错误,这将导致文件的一部分加载到内存中,之后I / O的执行速度会更快。

有关详细信息,请参阅此链接:10-Things-to-Know-about-Memory-Mapped-File-in-Java

答案 2 :(得分:0)

"现在假设每个进程都有一个允许在RAM中保存的N页。如果你的二进制文件消耗(Nb)页面,其他东西有N - Nb,包括MMF。这表明增加Nb的大小将减少MMF的可用页面数量。" OS使用LRU来处理页面替换。操作系统如何为每个进程级别提供总页数的上限?