正确处理大量对象

时间:2014-12-06 22:10:27

标签: java android memory jgrapht

嗯,在开始开发我的Android应用程序之前,我想我应该问过这个问题,但我相信在你的帮助下,伙计们,我仍然可以用我的项目做正确的事。

在我的项目中,我将在图表中寻找最短路径。我将在我的SQLite数据库中存储节点和边缘。但是,在寻找最短路径时,我将从数据库中获取所有条目并将它们映射到下面显示的对象。

public class NodeBean {
    private int nodeId;
    private String nodeName;
    private int nodeType;
    private int scannedTotal;
    private int scannedSinceLastSync;
    // + getters and setters
}

public class ConnectionBean{
    private int connectionId;
    private BigDecimal connectionWeight;
    private NodeBean firstNode;
    private NodeBean secondNode;
    private boolean someFlag;
    // + getters and setters
}

由于我将记录映射到对象,我将这两种对象存储在集合中(HashMap<Integer, NodeBean>用于NodeBeanArrayList<ConnectionBean>或数组用于{ {1}})。接下来,我将使用这些来使用JGraphT填充正确的图形并寻找最短路径。
不同的方法,可以省去一些RAM(因为我只创建一个集合而不是两个) &#34;从数据库中获取所有结果,并在将它们映射到对象时,将它们立即放入图形&#34;。这样我就不必将ConnectionBean存储在收藏中 - 因为我并不真正需要它。不过,我必须处理ConnectionBean s的大集合。

我试着估算一下我会用多少内存。如果我的计算得到纠正,我的NodeBean将使用 25B (4 * 32位(4 NodeBean个字段)+ ~72-80位(int字段包含大约10-15个字符,公式取自here)而我的String将使用大约 75-80B ConnectionBean + ~40B {{{ 1}}(来自here的模式)+ 2 * 64位(对于int个引用)+ 64位(对于BigDecimal - 取自here)暗示我有64-位VM)。

一开始,当我开始开发时,我会有大约400-500 NodeBean s和大约750-1000 boolean s。这样我甚至不会使用100kB(NodeBean)的内存(假设我的计算很好)。但是,我的应用程序应该是可扩展的,所以我假设我甚至可以拥有10k节点和20k连接 - 但即使在相当大的图形的情况下,这非常不同于发生 - 甚至不是2MB!


所以,现在当我们知道我的问题是什么时,这是我的问题:

  1. (最重要的)将 ALL 行从数据库映射到对象并将其保存在RAM中有多糟糕的习惯?我觉得它不是很好,但另一方面 - 可能我的UI会使用比这些对象更多的RAM。
  2. 我的计算或多或少准确吗?我的对象是否记录了所有字段的内存,或者我在这里遗漏了什么?
  3. 让我说我有这千个物品。他们使用一些记忆。我把它们放在地图上。我使用的内存大约是以前使用的内存的两倍,还是我只是在地图中存储1000 * 32/64位引用?

1 个答案:

答案 0 :(得分:0)

  1. 正如您已经想到的那样,如果这样做会使用比您希望的更多的内存,则会出现问题。如果控制了项目数量的上限,并且你知道这样做不会使应用程序崩溃,那就不那么糟了。

  2. 很难计算使用的内存量。最好的办法是尝试它,看看它的实际行为。

  3. 在地图中存储项目不会重复其内存占用。但是,它不仅仅是一个引用 - 您为每个引用添加了Map.Entry的开销。再次尝试一下,然后对其进行分析以了解它的行为方式。尝试最坏的情况。