2014-12-17 3 views
0

크기가 약 20MB이고 약 50 만 건의 파일을 읽었습니다. 특정 필드를 키로, 다른 필드를 값으로 사용하여 HashMap에 레코드를로드하고 있습니다. 이 맵의 키 - 값은 후속 프로세스에서 사용됩니다.Java - 파일 읽기 및 HashMap에서로드 - 시간을 줄이는 방법?

파일을 단순히 읽는 시간은 무시해도 좋습니다. 그러나 HashMap에 필드와로드를 구문 분석하는 데는 몇 시간이 걸릴 것으로 보입니다. 코드는

InputStream in = new FileInputStream(new File(file)); 
br = new BufferedReader(new InputStreamReader(in), 102400); 
if (br != null) { 
    for (String record; (record = br.readLine()) != null;) { 
     sb = new StringBuilder(record); 

     map.put(sb.substring(findStartIndex(fieldName1),findEndIndex(fieldName1)), sb.substring(findStartIndex(fieldName2),findEndIndex(fieldName2))); 

    } 
} 

findStartIndex()와 findEndIndex()

는 레코드 형식 XML을 구문 분석하고 필드의 시작과 끝 인덱스를 찾을 수있는 방법이 있습니다, 다소 보이는이를 좋아한다.

이 과정을 여러 파일에 대해 반복해야합니다. 어쩌면 런타임을 줄이기 위해 저에게 제안하십시오. 어떤 도움을 주셔서 감사합니다. 감사.

편집 :

입력 필드 이름과 인덱스 값이 XML 인 findStartindex 아래와 같이 findEndindex을 구현했습니다. 나는 각각에 대해 SaxParser, getters 및 setter를 사용했다. 시작과 끝 값을 발견했다.

+0

실제로 걸리는 시간은 얼마나됩니까? – markspace

+0

파일을 데이터 저장 용으로 사용하는 경우 SQL 데이터베이스를 사용하는 것이 좋습니다. – Victor2748

+0

findStartIndex 및 findEndIndex는 어떻게 구현합니까? 20MB/500000 레코드가 오래 걸리지 않습니다. – nhahtdh

답변

2

BufferedReader으로 초당 수백만 줄을 읽을 수 있습니다. 시간은 귀하의 도시되지 않은 XML 파싱에 의심의 여지없이 빠져 있습니다. 그것은 당신이 적절한 파서를 사용하지 않는 것 같지만 대신에 XML에서 문자열 검색을 시작하는 것입니다. 문자열의 시작 부분부터 시작하여 두 번째 단계입니다. 그렇지 않으면 각 줄을 XML로 네 번 파싱합니다. 보다 나쁜. 그러지 마. 필드를 찾으려면 XPath를 사용하십시오. 훨씬 빠르며 제대로 구현 된 SAX 파서 수신기입니다.

그리고 이미 회선을 가지고있을 때마다 각 회선을 새로 만들지는 않습니다.

NB br은 테스트 할 때 null 일 수 없습니다.

+0

예,'String'은'StringBuilder'보다 더 나은 선택이 될 것입니다 – gkiko

+0

고마워 .. 언급 한대로 변경하고 시간을 알려주 겠어 :) .. thanks again – Harbinger

+0

방금 ​​각 레코드의 구문 분석을 제거했습니다. 대신 한 번 구문 분석하고 값을 사용했습니다. 500k 레코드의 출력을 1 초도 채 안 남았습니다. 호 전체 제안을 구현하는 경우,보다 효율적으로 될 것입니다. 감사. 고마워요. 많이 .. – Harbinger