2014-11-21 4 views
-1

저는 이력 파서를 작성하고 있습니다. 이미 로깅 작업 (텍스트 기반)을 수행 한 응용 프로그램이 있습니다. 이제 관리자가 해당 로그를 읽을 응용 프로그램을 만들길 원합니다. 로그는 월말에 생성되며, [날짜]로 구분됩니다 :특정 바이트 (문자)로 바이트 배열 분할

[19-11-2014]
- 여기
어떤 일이 일어나는지 - 여기

[20 어떤 일이 일어나는지 -11-2014]
은 - 무슨 일이 여기
간다 - 여기 등

...

로그 파일이 작은 크기가있는 경우 어떤 일이 일어나는지, 문제의 기술 과정이 없다 g DataInputStream에 의해 바이트 []를 취득 해, 그것을 String에 변환 한 다음 (부분 문자열 등을 사용하여) 필터링 프로세스를 수행하십시오.

그러나 파일 크기가 크면 (약 100MB) JavaHeapSpace 예외가 발생합니다. 바이트의 []를 문자열로 변환하지 않으려 고 시도 할 때 내용의 길이가 String maxlength를 초과하기 때문에 이것이 예외라는 것을 알았습니다. 예외는 발생하지 않았습니다.

이제는 바이트 []를 여러 바이트 []로 분할하는 방법이 궁금합니다. 각각의 새로운 바이트 [] 만 포함되어 있습니다 하나 :

[날짜]
- 여기에 어떤 일이 일어나는지

그래서 우리는 로그에서 9 날짜가 한 달 이내에는 9 바이트로 분할 될 경우 [] . 스트링 마커는 [\\ d {2} - \\ d {2} - \\ d {4}]를 기반으로합니다. 문자열을 사용하는 경우 Regex를 사용하여 모든 마커를 찾을 수 있습니다. 그다.

하지만 먼저 문자열로 변환하지 않고 어떻게해야합니까? JavaHeapSpace를 던지면됩니다.

+0

로깅 작업을 수행하는 응용 프로그램을 수정할 수 있습니까? 그렇다면 어떤 로깅 시스템이 사용합니까? – jhamon

+0

고정 크기의 일부 버퍼에서 부분 구문 분석을 사용할 수 있습니까? 예를 들어 1024 바이트를 읽을 수 있고 다음 1024 바이트를 읽을 수 있습니다. – alexey28

답변

0

여기 몇 가지 개념이 빠져 있다고 생각합니다.

먼저 InputStream은 스트림으로, 이는 바이트 흐름을 의미합니다. 당신이하는 일은 당신에게 달려 있지만, 모든 스트림을 메모리에 저장하는 것은 스트림 구조 전체를 무시합니다.

두 번째로 DataInputStreamDataOutputStream에 의해 직렬화 된 이진 파일에서 개체를 읽는 데 사용됩니다. 이 문자열은 단순히 문자열을 읽는 것만으로도 잔인합니다. InputStream은 그렇게 할 수 있습니다.

귀하의 특정 문제에 관해서는 BufferedFileReader를 사용하고 다음 번에 도달 할 때까지 한 번에 한 줄씩 읽습니다. 이 시점에서 당신은 당신이 읽은 라인의 마지막 덩어리에서 당신이 필요로하는 모든 처리를 할 수 있고, 메모리를 확보 할 수 있습니다. 따라서 같은 문제에 빠지지 않습니다.