我很难在Java中看到内存映射文件(缓冲区)的好处。这是我在实践中看到的方法:
我们将文件块映射到主内存中,直接处理内存中的任何写入/读取,让操作系统将文件保存到磁盘中。
现在,我想将其与常规I / O和一些场景进行对比:
为了将文件映射到mem,我必须将其作为一个整体阅读,以进行整体修改。缓冲区大小最初是文件的大小(让我们说我不知道我要写入文件的数据量)。现在,为了附加到文件,我不能这样做,因为缓冲区的大小有限。所以最基本的操作对我来说似乎不可能。另外,读取整个文件以附加一小部分似乎相当浪费。所以我认为常规I / O在这种情况下表现更好。
为了保持更改,我仍然需要刷新它们。因此,如果我不定期这样做,我可能会丢失主内存中的更改。这与常规I / O流的想法相同,因此这里也没有增益。
这是我可以看到它工作的地方 - 用其他n个字节替换n个字节。尽管如此,将m个字符替换为m个字符似乎相当不寻常。我们希望Hello
并将其替换为Hi
。但是我们有一个填充的,固定大小的缓冲区,所以这并不容易......此外,它让我想起RandomAccessFile
具有更好的性能。
我写的大部分内容可能都是胡说八道,但我很乐意被告知,至于我,MemoryMappedBuffer似乎很难,甚至不可能使用。
答案 0 :(得分:5)
open
,read
,write
(它们非常慢,因为cpu具有如果您正在呼叫系统调用,请执行上下文切换然而,一个缺点是应该不时地将内存映射保存回磁盘。想象一下,你自己在RAM中进行了一些高度复杂的操作几个小时,突然之间出现了黑屏 - 所有信息都丢失了。
答案 1 :(得分:2)
在Java中使用内存映射文件有许多优点。其中一些是:
除了上述内容之外,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来处理页面替换。操作系统如何为每个进程级别提供总页数的上限?