2016-08-14 74 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

相关问题