将内存映射文件用作交换文件?

5
我正在Android上工作,由于内存有限且没有虚拟内存文件的功能。我看到有人在他们的应用程序中使用内存映射文件实现了类似虚拟内存文件的功能,但我不明白这是如何工作的。有人知道吗?
我认为一般的想法是,如果我的程序想要使用大小为20Mb的int数组,我可以在一个20Mb文件中创建此数组的数据,然后使用内存映射文件功能透明地将我当前需要读取和写入的部分文件带入内存中。关键要素是,虽然我有20Mb的可读/写空间,但只有很小一部分会同时在内存中(Android应用程序仅限于~24Mb的内存)。
我更喜欢使用Java进行操作,但C语言解决方案也可行。
编辑:这种内存映射文件技巧在这里提到,但我不明白它是如何工作的 http://grammerjack.blogspot.com/2009/10/gles-quake-port-of-quake-to-android.html

1
交换不是文件映射内存吗? - ruslik
Android没有配置交换空间。由于应用程序的工作方式,当内存不足时,操作系统可以杀死任何不在前台的应用程序。内存映射文件最适合只读数据(页面可以单独丢弃),但您也可以进行共享读/写以获得类似交换空间的行为。 - fadden
1个回答

1

在Java中,使用java.nio.MappedByteBuffer。

在C中,使用POSIX函数mmap()。它在Android上工作正常。


1
请注意,为了让映射中的脏页仍然与文件相关联,您必须向 mmap() 提供 MAP_SHARED 标志。 - caf
由于Java有一个名为“内存映射文件”的功能,我对这与mmap之间的区别感到困惑。无论如何,我该如何限制一次性将多少文件加载到内存中?我需要注意使用了多少内存,而mmap似乎只是要求映射文件的大小。如果我分配了整个20Mb文件,内存会发生什么情况? - rbcc
如果你在谈论android.os.MemoryFile类,那么它不是这个类——它是共享内存。如果你尝试通过映射系统拥有的内存来分配更多的内存,mmap将会出错。是否映射整个文件取决于你。mmap不会要求文件大小——它要求映射的大小,因此给你了只映射整个文件的一部分的选项。 - Seva Alekseyev
这是我关于Java内存映射文件的意思;它们听起来与mmap完全相同:http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/TIJ314_029.htm 我现在真的很困惑mmap。我原以为重点在于它管理将大文件的部分按需带入和带出内存,正如这里第一段所述:http://en.wikipedia.org/wiki/Mmap。 - rbcc
你是对的,我收回之前的话。在Android Java上确实有内存映射文件。 - Seva Alekseyev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接