2012-06-20 2 views
12

나는 다음과 모두를 사용하지만, 12메가바이트URL에서 12MB 텍스트 데이터를 다운로드하고 SD 카드에 저장 ... 힙 메모리 문제가 발생합니다. 어떤 해결책?

char[] chars = new char[1024]; 
int len; 
while((len=buffer.read(chars))>0) { 
    data.append(chars,0,len); 
} 

while ((line = reader.readLine()) != null) { 
    sb.append(line + "\n"); 
} 
+0

.. 내가 SD 카드에 저장하면 다음 또한 내가 ... 결과는 충돌이다 또한 더 힙 메모리를 필요로한다 문자열을 읽을 수있는 하나의 문자열 .. 너무 전체 XML 필요 .. –

답변

-1

나는 같은 문제가 없었다 나는 가능하다면, 당신은 XML 파일을 분할해야이 하나를 사용하고 문자열로 해당 파일을 읽고 구문 분석하려고합니다.

내가 XML을 구문 분석하고있어
+0

감사이 너무 나를 위해 좋은 아이디어를 찾는 데 도움이 될 수 있습니다. . –

+0

XML의 일부분을 누가 파싱 할 것인지 설명 할 수 있습니까? 내가 아는 것에서는 무효가 될 것입니다. –

1

당신은 아마 메모리에 전체 12메가바이트를 할당하려고하고 있는지 확인해야한다 data..of 거대한 작동하지 할당이 성공합니다. 그런 다음 버퍼에 데이터를로드하십시오.

또는 파일을 부분으로로드하여 처리 할 수있는 경우 효율적이어야합니다.

2

왜 XML을 청크로 읽고 각 청크를 SD 카드에 저장하지 않으시겠습니까? 이 솔루션의 유일한 문제점은 XML의 일부분을 동적으로로드하고 파싱 할 수있는 XML 스트림 파서를 필요로한다는 것입니다.

StaX라는 XML 용 스트리밍 API를 사용할 수 있으며이 경우 사용자 정의 입력 스트림을 작성할 수 있습니다. 어떤 예 http://www.vogella.com/articles/JavaXML/article.html#javastax

8

청크로 된 데이터를 SD 카드에 저장하십시오. 그런 다음, 안드로이드에 내장 된 XmlPullParser, 당신은 이전에 저장 한 파일을 구문 분석 할 수있는 다음과 같은 방법으로 사용 :

  1. 열기 방금
  2. 사용 방법 setInput(InputStream inputStream, String inputEncoding)
  3. 재밌게을 다운로드 한 파일에 입력 스트림을 구문 분석하는 동안 이 거대한 XML 파일.
2
  1. XmlPullParser 인스턴스 사용자의 입력 (Reader 또는의 InputStream 중 하나)와
  2. 전화 XmlPullParser.setInput 만들기; (소켓 또는 다른 방법으로) 다운로드 한 데이터입니다.
  3. XmlPullParser의 함수를 사용하여 XML 텍스트 파일을 구문 분석합니다.

참고 : 메인이 아닌 스레드에서이 작업을 수행해야합니다. 파일을 다운로드하는 데 오래 걸릴 수 있습니다. (어쨌든 당신은 UI 스레드에서 네트워크 작업을 할 수 없습니다). 이 메모리가 효율적이어야하며 XmlPullParser는 데이터를 메모리에 캐시하지 않습니다. 먼저 SD 카드에 파일을 저장할 필요가 없습니다.

연결 시간 초과, xml 오류 등도 감시합니다. 파서가 문서의 끝에 도달했다고보고하면 작업을 성공한 것으로 간주하십시오. 부품의

3

읽기

1

을 구문 분석 데이터 & 사용하여 SAXParser를 1MB는 ​​전체 XML 스트림을 구문 분석하고 하나 개의 거대한 DOM 객체를 생성해야하거나 덩어리가 할 구문 분석됩니다합니까?

당신이 할 수있는 유일한 것보다 완벽한 XML을 구문 분석해야한다면 더 많은 메모리와 64 비트 OS를 얻는 것입니다.
그렇지 않으면 SAX 또는 StAX 파서를 사용하여 스트림에서 청크를 가져 와서 구문 분석하거나 로컬에 저장 한 후에 청크를 파싱하십시오.

1

사용자의 필 요가 말한 것처럼 청크를 전체 파일이 아닌 청크로 다운로드하는 것이 좋습니다. 주 트레드에서 수행하면 모든 응용 프로그램이 느려질 수 있으므로 asynctask 및 덩어리로 처리하십시오. 그 외에도 주제에 관한 소식을 추천 해 드릴 수 있습니다.

-In this 후 당신은 내가이 두 기사가 도움이 될 수 있습니다 희망 다른 SAX and DOM tutorial

을 찾을 수 있습니다에 대한 how to use SAX

-In this 하나의 문서에 대한 링크를 찾을 수 있습니다 당신은 당신이 원하는 것을 얻을 수 있습니다. 두 기사 모두 문제가 해결되지 않으면 XML을 배열하는 더 좋은 방법을 찾으려고 할 수 있습니다. XML을 만드는 더 좋은 방법이 있습니다. 조금만 생각하면됩니다.

UPDATE :

-이 다른 게시물에 대한 STAX 도움이 될 수 있습니다, 원인은 XML 처리를위한 스트리밍 API입니다, 그래서 귀하의 경우에 가장 적합한을 할 수있다.

+0

왜 당신의 질문을 다시 열려고 시도하지 말고 다른 유사한 질문을 검색하거나 질문을 다시 읽기 시작하면 더 읽기 쉽고 열리더라도 밝은 미래가 보이지 않습니다. 하지만 어쩌면이 하나는 [CARTOONIFYING에 대한 POST (http://stackoverflow.com/questions/1357403/how-to-cartoon-ify-an-image-programmatically) –