2011-11-04 2 views
0

바이트 배열로 큰 파일을 읽고 arraylist에 추가하고 있습니다. 나쁜 ... 나는 메모리에 100MB 파일로 끝납니다. 나는 그들을 처리하고 라인별로 (또는 모든 x 라인 수만큼) 출력해야한다. 어떻게해야합니까? BufferedWriter는 ByteArrays를 사용하지 않습니다.즉석에서 큰 바이트 배열 쓰기 (메모리가 문제가되지 않도록)

+0

라인별로? 그래서 그 텍스트 파일입니까? 그런 다음 byte []로 읽지 말고 대신 Reader를 사용하십시오 (한 줄씩 읽음). – Thilo

+0

이들은 데이터베이스의 바이트입니다. 불행히도 나는이 인스턴스에서 문자열에 캐스트 할 수 없습니다. –

답변

1

나는 모두 당신이 그들을 어떻게 처리하는지에 달려 있다고 생각합니다. 한 번에 하나의 파일을 처리 할 수 ​​있습니다. 개별 파일이 너무 큰 경우 한 번에 100K를 읽고 줄 바꿈을 직접 구문 분석하십시오. 파일의 마지막 줄 바꿈까지 모든 것을 처리하고 나머지 부분을 배열의 시작 부분으로 옮기고 더 많은 데이터를 읽습니다. 이것들은 간단한 기술이지만 처리 방법에 대해 알지 못해서 내가 제안 할 수있는 전부입니다. 왜, 시도의 BufferedReader

당신이 자바 7 사용하는 경우를 사용하지 않는

0

메모리 매핑 된 파일을 사용합니다. 이렇게하면 힙을 많이 사용하지 않고 "메모리 내"MB 또는 GB를 사용할 수 있습니다. (몇 KB).

외부 소스의 데이터 인 경우에도 직접 메모리 또는 메모리 매핑 된 파일에 배치 할 수 있습니다.

0

이진 파일 인 경우 줄 단위로 읽는 것에 대해 이야기하는 것이 적절하지 않습니다. 어쨌든 대용량 파일을 전체 메모리에 저장하지 않고 순차적으로 처리하려면 해당 파일을 스트리밍하는 것이 좋습니다. InputStreamOutputStream 유형을 살펴보십시오. 그리고 이름에 'ByteArray'가있는 모든 유형을 피하십시오.

0

이와 같이 "즉시"데이터를 처리하는 것은 스트리밍이라고합니다. 한 스트림에서 데이터가 도착하고 처리되며 다른 스트림에 저장되므로 모든 것을 메모리에 저장하지 않아도됩니다.

데이터베이스에서 직접 가져온 경우 ResultSet은 모든 결과 행을 한 번에 가져 오지 않습니다. 루프를 통해 안전하게 반복하여 "즉시"행을 처리 할 수 ​​있습니다.

파일 인 경우 스트림 (예 : FileInputStream)으로 읽을 수 있으며 작은 청크를 미리 가져올 수 있습니다. 텍스트 파일 인 경우 줄 바꿈시 모든 자동 버퍼링 및 분할에 Reader을 사용하십시오.

어디서나이 데이터를 가져 와서 "즉시"처리하고 출력물에 쓸 수 있습니다. 다시 말하지만, 바이트 배열에 쓰지 않고 스트리밍을 수행하십시오 (예 : FileOutputStream 또는 Writer).

관련 문제