0

json으로 구성된 내 안드로이드 앱에 텍스트 파일이 있습니다. 나는 그 json을 읽고 파싱 할 필요가있다. 파일 크기는 21MB입니다. 파일을 읽으려면 다음 코드를 사용하고 있습니다.안드로이드 앱의 텍스트 파일에서 큰 json을 읽는 방법?

StringBuilder stringBuilder = new StringBuilder(); 
InputStream input = getAssets().open(filename); 
int size = input.available(); 
byte[] buffer = new byte[size]; 
byte[] tempBuffer = new byte[1024]; 
int tempBufferIndex = 0; 
for(int i=0; i<size; i++){ 
    if(i == 0){ 
     tempBuffer[tempBufferIndex] = buffer[i]; 
    }else{ 
     int mod = 1024 % i; 
     if(mod == 0){ 
      input.read(tempBuffer); 
      stringBuilder.append(new String(tempBuffer)); 
      tempBufferIndex = 0; 
     } 
     tempBuffer[tempBufferIndex] = buffer[i]; 
    } 
} 
input.close(); 

크기 int는 20949874입니다. 루프가 끝나면 stringBuilder 길이는 for 루프를 변경하더라도 항상 11264입니다. 루프를 사용하지 않고 InputStream에서 하나의 문자열을 만들려고했지만 항상 OutOfMemoryError Exception을 제공합니다. 내 로그에는 "Grow heap (frag case)"이 20949890 바이트 할당의 경우 26.668MB가됩니다. 나는 여기에서 수색하고 다른 해결책을 시도하고 그러나 그것을 일하지 않았다. 어떤 생각을 어떻게하면이 문제를 해결해야합니다. 미리 감사드립니다.

+0

gson – wvdz

+0

을 사용하는 것이 좋습니다. 앱 전용 힙 크기를 초과했다고 생각하면 아래 Suvitruf 응답을 확인하십시오. – Yazan

답변

2

큰 json 파일의 경우 DOM이 아닌 SAX 파서를 사용해야합니다. 예 : JsonReader.

DOM ("문서 객체 모델")는 메모리에 전체 내용을로드하고 그들이 원하는대로 데이터를 조회 할 수있는 개발자를 허용합니다. SAX은 데이터를 스트림으로 표시합니다. 개발자는 원하는 데이터 조각이 나타날 때까지 기다렸다가 필요한 부분 만 저장합니다. DOM은 사용하기 쉽다고 여겨지지만 SAX는 훨씬 적은 메모리를 사용합니다.

2

파일을 여러 부분으로 나누어 볼 수 있습니다. 그래서 처리하는 동안 응용 프로그램이 메모리 부족 상태가되지 않도록하십시오. 당신은 또한에 "largeHeap"플래그를 사용하는 것이 좋습니다

매니페스트 (http://developer.android.com/guide/topics/manifest/application-element.html 참조)

내가 파일을 모르지만, 당신은 작은 JSON 태그를 사용하는 경우, 아마 당신은뿐만 아니라 저장 공간을 줄일 수 있습니다.