【问题标题】:Using a memory mapped file as a swap file?使用内存映射文件作为交换文件?
【发布时间】:2011-02-02 03:09:42
【问题描述】:

我在内存有限且没有交换文件之类的功能的 Android 中工作。我读到人们已经在他们的应用程序中使用内存映射文件实现了类似交换文件的功能,但我不明白这是如何工作的。有人知道吗?

我认为一般的想法是,如果我的程序想要使用一个大小为 20Mb 的 int 数组,我可以在 20Mb 文件中为该数组创建数据,然后使用内存映射文件功能透明将我当前需要读取和写入的文件部分带入内存。关键因素是,虽然我有 20Mb 的空间可以读取/写入,但每次只有一小部分在内存中(Android 应用程序的内存限制为 ~24Mb)。

我更愿意为此使用 Java,但 C 解决方案也可以。

编辑:这里提到了这个内存映射文件技巧,但我不明白它是如何工作的 http://grammerjack.blogspot.com/2009/10/gles-quake-port-of-quake-to-android.html

【问题讨论】:

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

标签: java android c java-native-interface android-ndk


【解决方案1】:

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

在 C 中,使用 POSIX 函数 mmap()。它在 Android 上运行良好。

【讨论】:

  • 请注意,要使映射中的脏页保持文件支持,您必须将MAP_SHARED 标志提供给mmap()
  • 由于 Java 有一个称为“内存映射文件”的功能,我对它和 mmap 之间的区别感到困惑。无论哪种方式,我如何限制一次有多少文件在内存中?我需要知道正在使用多少内存,而 mmap 似乎只是询问要映射的文件的大小。如果我分配了所有 20Mb 文件,内存会怎样?
  • 如果你说的是 android.os.MemoryFile 类,那不是它——它是共享内存。如果您尝试通过系统拥有的映射来分配更多内存,则 mmap 将出错。是否映射整个文件取决于您。 mmap 不要求 file 的大小 - 它要求映射的大小,因此您可以选择仅映射整个文件的一部分。
  • 这就是我对 Java 内存映射文件的意思;它们听起来与 mmap 完全相同:linuxtopia.org/online_books/programming_books/thinking_in_java/… 我现在对 mmap 感到非常困惑。我认为重点是,它可以按需将大文件的各个部分进出内存,如此处第一段所示:en.wikipedia.org/wiki/Mmap
  • 你是对的;我收回之前说过的话。 Android Java 上毕竟有内存映射文件。
猜你喜欢
  • 2011-02-04
  • 2013-02-17
  • 2016-02-23
  • 1970-01-01
  • 2012-03-25
  • 2015-02-16
  • 1970-01-01
  • 2011-07-30
  • 1970-01-01
相关资源
最近更新 更多