嗯,在开始开发我的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>
或数组用于{ {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!
所以,现在当我们知道我的问题是什么时,这是我的问题:
答案 0 :(得分:0)
正如您已经想到的那样,如果这样做会使用比您希望的更多的内存,则会出现问题。如果控制了项目数量的上限,并且你知道这样做不会使应用程序崩溃,那就不那么糟了。
很难计算使用的内存量。最好的办法是尝试它,看看它的实际行为。
在地图中存储项目不会重复其内存占用。但是,它不仅仅是一个引用 - 您为每个引用添加了Map.Entry的开销。再次尝试一下,然后对其进行分析以了解它的行为方式。尝试最坏的情况。