2016-08-14 1 views
0

SAXParser로 2GB XML 파일을 구문 분석하려고합니다. 내 임무는 정보 재발행에 관한 것이고 나는 필요한 정보를 기억해야한다고 들었다. 파일은 단어들로 구성된 문서들로 분리되어 있습니다. 각 단어는 다른 문서의 모양을 저장해야하는 대상입니다. 다음 문서가 시작될 때 나는 모든 객체를 팝업하여 가능한 크기의 메모리가되도록 완벽한 크기의 배열에 넣습니다. 문제 :이 메서드는 너무 많은 임시 개체를 생성하므로 가비지 수집기가 너무 많은 작업을 수행합니다. 그 많은 임시 개체를 만드는 것을 피하거나 버퍼를 GC와 충돌시키지 않는 방법이 있습니까?자바에서 큰 버퍼를 관리하는 방법은 무엇입니까? 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

간단히 배열'T [] elements'를'Stack'에 저장하면 더 쉬울 것입니다; 당신이 공간을 다 쓸 때 곱셈의 양만큼 길이를 늘리십시오. StackObject 클래스의 인스턴스는 필요 없습니다. –

답변

0

Stack 클래스는 메모리 사용시 비효율적입니다. 스택 입력 당 약 12 ​​배의 메모리를 ArrayList (말하기)보다 많이 사용합니다. 크기 조정이 너무 많은 시간을 소요하기 때문에 예를 들어 ArrayList를 사용

알고 보니 너무 느린 :

는이 말.

해결 방법 중 하나는 크기를 조정할 때 보조 배열의 크기를 두 배로 늘리는 배열 기반 스택을 구현하는 것입니다. 크기 조정을 위해이 정책을 사용하면 N이 빈 스택으로 푸시되어 크기 조정으로 인해 N2N 사이의 추가 사본을 제공합니다.

여하튼, 크기 조정시 CPU를 절약 할 수있는 반면, 많은 구현은 많은 StackObject 인스턴스를 생성하는 오버 헤드와 가비지 수집, 가난한 지역성의 간접 비용 , 메모리 풋 프린트 증가.

+0

'ArrayList'는 이미 인덱스 사이징을 사용합니다. 이것은 삽입 작업을 처음에 O (1)로 상각하게 만드는 것입니다. – the8472

+0

나는 그것을 알고 있습니다. 그러나 성장 정책은'new_size = current_size + 50 %'이다. –

+0

1.5N 대 2N의 차이 또는이를 만들지 또는 깨뜨리지 않습니다. – the8472

관련 문제