2014-12-06 95 views
1

嗯,我想我应该在开始开发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>ConnectionBean数组)。接下来,我将使用这些来使用JGraphT填充适当的图并寻找最短路径。
不同的方法,可以省去一些内存(因为我只创建一个集合而不是两个)是“从数据库获取所有结果,并在将它们映射到对象期间,立即将它们放入图中”。这样我就不必在收藏中储存ConnectionBean - 因为我并不需要它。不过,我还得处理NodeBean s的大集合。

我试图估计我会使用多少内存。如果我的计算被校正,我的NodeBean将使用大约25B(4 * 32位(4个int字段)+〜72-80位(含约10-15个字符String字段中,从here取式)和我的ConnectionBean将使用约75-80B(4B为int +〜40B为BigDecimal(图案从here)+ 2 * 64个比特(用于NodeBean引用)+ 64位(boolean - 从here截取)暗示我有64位VM)。

在一开始,当我开始发展时,我虽然我w应具有约400-500个NodeBean秒和约750-1000个ConnectionBean秒。这样,我甚至不会使用100kB(25B * 500 + 80B * 1000 = 92.5kB)的内存(假设我的计算很好)。然而,我的应用程序应该是可扩展的,所以我认为我可以有10k节点和20k连接 - 但即使是那个相当大的图形,这也不会发生 - 甚至不到2MB!


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

  1. (最重要的)如何坏习惯是从数据库中的所有行映射到对象并将其保存在RAM中?我觉得我的内心不好,但另一方面 - 可能我的UI会比这些对象使用更多的RAM。
  2. 我的计算或多或少准确?我的对象是否像它所有的领域一样记忆犹新,或者我在这里错过了什么?
  3. 假设我有这一千个物体。他们使用一些内存。我把它们放在地图上。我使用的内存大约是我以前使用过的内存的两倍,还是我只是在Map中存储了1000 * 32/64位引用?

回答

0
  1. 正如你已经想通了,这是一个问题,如果比你想这样做会占用更多的内存。如果项目数量的上限得到了控制,并不是很糟糕,并且您知道这样做不会导致应用程序崩溃。

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

  3. 将项目存储在地图中并不重复其内存占用。但是,它不仅仅是一个参考 - 你要为每个Map.Entry添加开销。再次尝试一下,并对其进行分析以查看它的行为。尝试最糟糕的情况。