【问题标题】:Large static map in program memory Java程序内存 Java 中的大型静态映射
【发布时间】:2013-05-02 18:28:18
【问题描述】:

我正在将旧设备中的 16 位代码转换为表格定义的字符串。代码有2000多个,代码不连续。

它们目前在这样的 HashMap 中定义...

public class SomeActivity {
    private static final Map<Integer, String> myMap;
    static {
        Map<Integer, String> aMap = ...;
        aMap.put(0x2345, "this");
        aMap.put(0xFEA3, "that");
        ...
        myMap = Collections.unmodifiableMap(aMap);
    }
}

这是为 android 移植的,我担心这会在设备上占用多少 RAM。我可以做类似的事情,但存储在程序内存中吗?

【问题讨论】:

  • 你不能使用属性文件吗?
  • @user503413 你能举个例子吗?
  • 如果不是 RAM,您认为“程序内存”是什么?您是否实际测试过它是否有问题? (对于 2000 个地图条目,它不会占用 那么多 内存。)
  • 您是否只测试了一个元素,然后使用了所有 2 千个元素,在 Eclipse 的分析器中观察大小
  • 使用每个映射条目 64 字节的快速粗略计算为 2000 个条目的映射提供 128KB。不是问题,例如 最低 分辨率的低端 Android 设备上的 单个 全屏位图就像 两倍 一样大。

标签: java android memory collections map


【解决方案1】:

这些代码可能不是连续的,但如果它们相当密集(即存在min(keys)max(keys) 之间的数字的可能性很高,比如超过 75%),您也许可以节省一些空间- 构造一个大小为max(keys)-min(keys)String[] 对象并将其用作地图。

如果它是可用的/Android 开发的一个选项,原始地图和其他数据结构的另一个极好的替代方案是 Trove library,它同样可以在使用原始数据结构时为您节省大量空间和时间。

另外,既然您调用 Collections.unmodifiableMap(),请考虑使用 Guava 的 ImmutableMap - 它不如 Trove 高效,后者避免了自动装箱原语,但它比 Java 的标准 HashMap (though slightly slower) 内存效率更高。

也就是说,就像 cmets 所暗示的那样,您很可能什么都不担心。一如既往,“过早的优化是万恶之源”。很可能一个简单的 Java HashMap 就能很好地为您服务。

【讨论】:

    【解决方案2】:

    SparseArray (http://developer.android.com/reference/android/util/SparseArray.html) 比基本的 HashMap 更合适。

    您也可以将其放入您放入程序资产的属性文件(请参阅http://developer.android.com/reference/java/util/Properties.html)中(您仍然必须将所有文件加载到内存中才能读取 1 个值)

    您甚至可以从中预先制作一个 sqlite 数据库并从您的资产中复制它(请参阅http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/)。在这种情况下,值在文件中,并且只加载所需的元素。

    但是,除非您的字符串很长,否则我不会担心 RAM 中有 2000 个项目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-29
      • 2020-01-25
      • 2010-11-04
      • 1970-01-01
      • 2011-01-01
      相关资源
      最近更新 更多