嗯,我想我应该在开始开发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>
为NodeBean
,ArrayList<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!
所以,现在当我们知道我的问题是什么,这里是我的问题:
- (最重要的)如何坏习惯是从数据库中的所有行映射到对象并将其保存在RAM中?我觉得我的内心不好,但另一方面 - 可能我的UI会比这些对象使用更多的RAM。
- 我的计算或多或少准确?我的对象是否像它所有的领域一样记忆犹新,或者我在这里错过了什么?
- 假设我有这一千个物体。他们使用一些内存。我把它们放在地图上。我使用的内存大约是我以前使用过的内存的两倍,还是我只是在Map中存储了1000 * 32/64位引用?