嗯,我想我應該在開始開發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位引用?