2016-08-14 31 views
0

我嘗試使用SAXParser解析2GB XML文件。我的任務是關於中世紀的信息,我被告知要處理我在記憶中需要的信息。該文件被分成由文字組成的文件。每個單詞都是一個對象,其中應該存儲其他文檔中的外觀。 當下一個文檔開始時,我會彈出所有這些對象,並將它們放入一個完美大小的數組中,以儘可能提高內存的效率。現在的問題:這種方法創建了太多的臨時對象,所以垃圾收集器做了太多工作。有沒有辦法避免創建許多臨時對象或使緩衝區不與GC發生衝突?如何在java中管理大型緩衝區?超過GC開銷限制

public class Stack<T> { 
StackObject<T> top; 
boolean empty; 
int entryCounter; 
Stack(){ 
    empty = false; 
} 
public void init(T obj){ 
    top = new StackObject<T>(obj); 
} 
public T pop(){ 
    T tmp = top.self; 
    if(top.next != null){ 
     top.self = null; 
     top = top.next; 
    } 
    else{ 
     empty = true; 
    } 
    return tmp; 
} 
public void push(T obj){ 
    StackObject<T> tmp = new StackObject<T>(obj); 
    tmp.next = top; 
    top = tmp; 
    entryCounter += 1; 
    if(tmp.next == tmp){ 
     System.out.println("ERROR"); 
    } 
} 
} 

class StackObject<T>{ 
T self = null; 
StackObject<T> next = null; 
StackObject(T obj){ 
    self = obj; 
} 
} 
+0

這很不清楚 - 你基本上試圖描述一些代碼,然後問我們如何使它更有效率。這些臨時對象是什麼? –

+0

我編輯了請求。 – Benedikt

+0

簡單地在'Stack'中存儲數組'T [] elements'會更容易;然後在空間不足時將其長度增加一倍。不需要'StackObject'類的實例。 –

回答

0

您的Stack類的內存使用效率低下。它將比每個堆棧的內存使用大約4倍的內存(比如說)ArrayList

你這樣說:

使用ArrayList的,例如原來是太慢,因爲調整大小花費太多時間。

解決該問題的一種方法是實現基於數組的堆棧,使其在調整大小時使備份數組的大小加倍。如果您使用此政策調整大小,則N由於調整大小而被推送到空的堆棧將會在N2N之間產生額外的副本。無論如何,儘管你可能在調整CPU大小時保留CPU,但另一方面,當前的實現在構建許多StackObject實例的間接費用以及垃圾收集的間接成本,差的局部性上失去了很多收益,並增加了內存佔用。

+0

'ArrayList'已經使用指數大小,這是什麼使其插入操作攤銷O(1)在第一個地方 – the8472

+0

我知道這一點。但增長政策是'new_size = current_size + 50%'。 –

+0

1.5N與2N之間的差異或不太可能造成或破壞它。 – the8472

相關問題