2014-12-06 94 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添加開銷。再次嘗試一下,並對其進行分析以查看它的行爲。嘗試最糟糕的情況。