실제로 도움을 요청하는 내용.
먼저 파일의 n 번째 줄로 점프하려면 먼저 파일의 이전 부분을 읽고 줄 바꿈 횟수를 계산해야합니다. 예를 들면 다음과 같습니다 sed
명령하지 인스턴트 얼마나
$ ruby -e '(1..10000000).each { |i| puts "This is line number #{i}"}' > large_file.txt
$ du -h large_file.txt
266M large_file.txt
$ purge # mac os x command - clears any in memory disk caches in use
$ time sed -n -e "5000000p; 5000000q" large_file.txt
This is line number 5000000
sed -n -e "5000000p; 5000000q" large_file.txt 0.52s user 0.13s system 28% cpu 2.305 total
$ time sed -n -e "5000000p; 5000000q" large_file.txt
This is line number 5000000
sed -n -e "5000000p; 5000000q" large_file.txt 0.49s user 0.05s system 99% cpu 0.542 total
주, 그것은 5 백만 라인이 어디에 있는지 알아 내기 위해 파일의 처음 부분을 읽어했다. 그래서 두 번째 실행은 내게 훨씬 빠릅니다. 컴퓨터가 파일을 RAM에 캐시했습니다. 당신은 항상 다음 줄을 읽기 위해 다른 파일의 일부 또는 파일 사이에 점프하는 경우 (수동으로 파일을 분할하여)이 해내 할 경우에도
, 당신은 가난한 IO 성능을 얻을 것이다. 더 나은 것 무엇
대신 별도의 스레드 (또는 프로세스)의 모든 n 번째 라인을 처리하는 것입니다. 이렇게하면 여러 개의 CPU 코어를 사용할 수 있지만 여전히 우수한 IO 성능을 발휘합니다. 이것은 parallel 라이브러리를 통해 쉽게 수행 할 수 있습니다.(4 개 공정을 사용)
$ ruby -e '(1..10000000).each { |i| puts "This is line number #{i}"}' > large_file.txt # use a smaller file to speed up the tests
$ time ruby -r parallel -e "Parallel.each(File.open('large_file.txt').each_line, in_processes: 4) { |line| puts line if (line * 10000) =~ /9999/ }"
This is line number 9999
This is line number 19999
This is line number 29999
This is line number 39999
This is line number 49999
This is line number 59999
This is line number 69999
This is line number 79999
This is line number 89999
This is line number 99990
This is line number 99991
This is line number 99992
This is line number 99993
This is line number 99994
This is line number 99995
This is line number 99996
This is line number 99997
This is line number 99999
This is line number 99998
ruby -r parallel -e 55.84s user 10.73s system 400% cpu 16.613 total
$ time ruby -r parallel -e "Parallel.each(File.open('large_file.txt').each_line, in_processes: 1) { |line| puts line if (line * 10000) =~ /9999/ }"
This is line number 9999
This is line number 19999
This is line number 29999
This is line number 39999
This is line number 49999
This is line number 59999
This is line number 69999
This is line number 79999
This is line number 89999
This is line number 99990
This is line number 99991
This is line number 99992
This is line number 99993
This is line number 99994
This is line number 99995
This is line number 99996
This is line number 99997
This is line number 99998
This is line number 99999
ruby -r parallel -e 47.04s user 7.46s system 97% cpu 55.738 total
번째 버전 빠른 일본어, 약 4 배의 시간이 29.81 % 완료 :
사용 예는 (제 컴퓨터는 4 개의 코어를 가지고).
'split' 명령을 사용하여 파일을 더 작은 파일로 분할 한 다음 작은 파일을 병렬로 처리합니다. – saihgala
파일에서 일부 문자열을 일치시켜야하는 경우 분할하는 방법에 대해주의해야합니다. 절반에서 일치하는 내용을 분리하여 놓칠 수 있기 때문입니다. – fotanus