0

实际上,我从 Web 服务中获取了 25,000 个 JSON 对象,并且我正在使用 Jackson 来解析它们,当我试图在集合(HashMap、LinkedHashMap、Array List、Map)中拥有它时,不幸的是我正在使用所有这些对象进入“Android中的内存不足异常”..有人可以在我的情况下使用巨大的对象对此进行过实验,它最多可能会达到50,000个对象。那么我该如何更好地处理。我试图通过扩展上述集合来创建一些自定义对象,但我还不够好,无法将其取出。请有任何建议。

4

4 回答 4

4

如果你有足够的内存,50000 或 5000 万个对象都不是问题。如果您的内存有限,一种选择是将值存储在磁盘上,例如存储卡。每个键可以有一个文件,文件的内容就是值。如果这些值很小(< 1 KB),您可以以某种方式组合这些值以减少使用。由于数据是文本,因此您也可以压缩数据以减少磁盘使用量。

您可以保留最近值的缓存。此缓存可能是最后 10 - 1000 个键/值,因此可以通过磁盘上的其余部分快速访问它们。

如果您压缩数据后,它不适合设备的存储,您可能需要将存储移动到服务器并通过网络提取您需要的信息。

于 2013-01-22T16:35:37.410 回答
1

你真的需要内存中的对象吗?您可以解析项目并将它们存储在 sqlite 数据库中。只要您想显示项目,就只从数据库中获取所需的项目。

于 2013-01-22T16:37:11.413 回答
1

在Java中,有一些3party库,已经实现;将集合存储到硬盘。像 MegaMap,但在 android 上;我认为它没有经过太多测试。

http://megamap.sourceforge.net/index.html

由于可以获得 5 万个 Object,我建议您实现一个 sqlite 数据库来存储信息。这样您就可以在需要时仅获取所需的信息。希望这可以帮助。

于 2013-01-22T17:16:08.647 回答
0

一种减少内存占用的技术:

我将讨论字符串,但以下内容也适用于其他对象。

为了防止在多个实例中持有相同的(.equals)对象,请执行以下操作

private Map<String, String> sharedStrings = new HashMap<>().

public void shareString(String s) {
    String t = sharedStrings.get(s);
    if (t == null) {
        t = s;
        sharedStrings.put(t, t);
    }
    return t;
}
于 2013-01-22T16:28:33.750 回答