2016-10-04 4 views
1

줄 번호를 기반으로 파일에서 특정 줄을 읽는 방법을 만들었습니다. 그것은 대부분의 파일에 대해 잘 작동하지만 아주 긴 줄이 많이 들어있는 파일을 읽으려고하면 파일에 더 오래 걸리는 것처럼 오래 걸립니다. 나는 또한 디버깅을 해봤고 메모리도 많이 사용하는 것처럼 보입니다. 그러나 이것이 향상 될 수 있는지는 잘 모르겠습니다. 파일에서 특정 줄을 읽는 방법에 중점을 둔 몇 가지 다른 질문이 있다는 것을 알고 있지만이 질문은 주로 성능 측면에 중점을 둡니다.파일에서 특정 줄을 읽는 속도가 매우 느림

빛보다 빠른 방법으로이 방법을 최적화하려면 어떻게해야합니까?

+1

시도 [이] (http://stackoverflow.com/a/29637400/276052) 그러나으로 제한 할'처럼 (끝 - 시작) 것을 사용'와'.collect을 (Collectors.toList())' . – aioobe

+0

가능성 => https://stackoverflow.com/a/9174095/2877364 – cxw

+1

당신은'start' 라인을 찾은 다음'end - start' 라인 만 읽을 수도 있습니다 –

답변

0

이전에 내가 한 일은 본질적으로 느리고 너무 많은 메모리를 소비한다는 것을 깨달았습니다.

모든 줄을 메모리에 추가 한 다음 List의 모든 줄을 처리하면 두 배의 시간이 걸리지 않고 아무 이유없이도 String 개의 변수가 만들어졌습니다.

저는 지금 Java 8 Stream을 사용하고 있으며 지금까지 사용해 왔던 가장 빠른 방법 인 읽기 시점에서 처리하고 있습니다.

Path path = Paths.get(file.getAbsolutePath()); 
Stream<String> stream = Files.lines(path, StandardCharsets.UTF_8); 
     for (String line : (Iterable<String>) stream::iterator) { 
     //do stuff 
     } 
} 
+0

원래의 예제에서 수행했던 것과 본질적으로 다른 것은 아닙니다. 그래서 뭔가 다른 것이 가능해졌습니다. 문제가 무엇인지 추측하기보다, 실제로 visualvm 또는 jtop을 사용하여 시간을 보내고있는 프로파일 링을 시도해야합니다. 코드가 잘 보입니다. 내가 성능이 좋지 않을 것이라고 생각할 수있는 유일한 이유는 힙이 너무 작 으면 가비지 수집을 시작하기 때문입니다. 또한 synchronized가 의심 스럽습니다. 여러 스레드에서이 것을 호출하는 많은 메소드가 있습니까? –

+0

@ JillesvanGurp : 나는 동기식에 관해서는 똑같이 생각했지만 복용 후에는 아무런 차이가 없다고 생각했다. 쓰레드가 없었기 때문에 유틸리티 메소드를 사용하는 것이 우수 실행이라고 생각했습니다. JVM 코드에서는 모든 중요한 비트가 장면 뒤에서 발생하기 때문에 이러한 종류의 메서드를 프로파일 링하는 것은 약간 어렵습니다. – Hooli

관련 문제