簡體   English   中英

動態多維Java結構替換靜態多維數組

[英]Dynamic Multidimensional Java Structure to Replace Static Multidimensional Array

我正在為我的大學重構一小部分開源大型配置管理系統。

我們正在使用一些像Weka這樣的機器學習的開源工具,而我分配給重構的方面是處理數據挖掘和構建規則。

我們從利物浦和日本使用的開源文件運行良好,但是當我們在大型項目中使用該程序時,存在一些內存使用問題。

我已經分離了主要的內存占用,並得出結論我需要找出一個不同的數據結構來存儲和操作數據。 就目前而言,該程序正在使用最終成為非常大的整數,對象,字符串等多維數組。

在我們導出行為規則之后,有幾種方法可以簡單地重新配置關聯的設置。 在許多情況下,我們只是添加或減去單個元素,或者簡單地展平多維數組。

我主要使用C / C ++進行編程,所以我不是Java中可用的數據結構的專家。 我想要替換靜態數組是一個動態結構,可以輕松調整大小,而無需創建第二個多維數組。

現在發生的事情是,每次我們添加和刪除多維數組中的規則,對象或其他雜項數據時,我們都必須創建一個全新的結構。 然后我們立即復制到新陣列。

我希望能夠簡單地使用相同的多維數組,只需添加一個新的行和列。 隨后,我希望能夠通過簡單地保存臨時值並覆蓋先前的值,左移,右移等來操縱結構中的數據。

任何人都可以想到Java中適合該法案的任何數據結構嗎?

在相關的說明中,我已經研究了顯式垃圾收集,但是我發現我只能通過調用System.Gc()或通過調整來操縱JVM的垃圾收集行為來真正建議收集JVM。 有更好或更有效的方法嗎?

問候,埃德

如果矩陣中有很多null / zeroes / falses / empty-strings,那么可以使用稀疏矩陣實現來節省空間。 Matrix-toolkits有幾個稀疏矩陣,您可以使用/修改它們以滿足您的需要,或者您可以使用帶有{x,y}元組的散列圖作為鍵。 (散列映射還有一個優點,即有幾個可用的外部hashmap實現,例如BerkeleyDB ,因此你不太可能會耗盡內存。)

要使用動態結構替換靜態數組,請使用隨數據自動增長的ArrayList 要具有二維數據結構,請使用List of List作為

List<List<Integer>> dataStore = new ArrayList<List<Integer>>();
dataStore.add(new ArrayList<Integer>());
dataStore.add(Arrays.asList(1, 2, 3, 4));

// Access [1][3] as
System.out.println(dataStore.get(1).get(3)); // prints 4

既然如此,你談到了對垃圾收集的控制(Java本身就能很好地完成所有工作),那么內存管理似乎是至關重要的,因為這是首先導致重新分解的原因。

您可以查看Flyweight GoF模式,該模式專注於共享對象,而不是重復它們以減少應用程序的內存占用。 要啟用共享flyweight對象,需要使其成為不可變的

Psuedo代碼:

// adding a new flyweight obj at [2][1]
fwObjStore.get(2).set(1, FWObjFactory.getInstance(fwKey));

public class FWObjFactory {
    private static Map<String, FWObject> fwMap = new HashMap<String, FWObject>();

    public static getInstance(String fwKey) {
        if (!fwMap.containsKey(fwKey)) {
            fwMap.put(fwKey, newFwFromKey(fwKey));
        }
        return fwMap.get(fwKey);
    }

    private static FWObject newFwFromKey(String fwKey) {
        // ...
    }
}

Java中沒有多維事物.Java有數組數組。

您可以將ArrayList與type參數一起用作ArrayList

ArrayList<ArrayList<yourType>> myList = new ArrayList<ArrayList<yourType>>();

此外,不要擔心GC ..它會在需要時收集..

我會研究使用“列表清單”。 例如,您可以聲明類似的內容

List<List<Object>> mArray = new ArrayList<List<Object>>();

任何時候你需要添加一個新的“行”,你可以做類似的事情:

mArray.add (new ArrayList<Object>());

查看List接口,了解如何使用Java中的List s以及哪些類實現接口(或自行滾動!)。

為什么不使用兩個拼湊在一起的Lists 像這樣:

List<List<String>> rowColumns = new ArrayList<>();

// Add a row with two entries, or columns:
List<String> oneRow = Arrays.asList("Hello", "World!");
rowColumns.add(oneRow);

此外,考慮使用地圖映射到列表中的條目。

垃圾收集通常不必在Java中明確處理。 通常,您希望在首次出現內存時查找內存泄漏。 當發生這種情況時,查找不應該死的后台線程或緩存中的強引用。 如果你想讀一些關於后一個問題,你就可以開始在這里這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM