저는 8코어 Mac OS X에서 다음 명령을 실행하고 있습니다.
for i in $(cat file1);do grep "$i" file2; done > output.txt
내 file2에는 900만 개의 행이 있으므로 시간이 많이 걸립니다. 모든 코어를 사용하여 작업을 분할하고 모든 작업을 더 빠르게 완료할 수 있습니까?
답변1
작업을 더 빠르게 만드는 다른 방법이 있습니다. 를 사용하세요 grep -f file1 file2 >output.txt
.
Gnu 병렬성을 사용할 수도 있습니다.http://www.gnu.org/software/parallel/parallel_tutorial.html
답변2
grep -F -f needles.txt haystack.log
당신이 원하는 것.
-F
전체 정규식이 필요하지 않은 경우 grep에서 간단한 패턴 일치를 사용하도록 하세요. 이로 인해 속도가 크게 향상되는 경우가 많습니다. 검색하는 내용에 따라 정규식이 필요하지 않을 수도 있으므로 더 간단한 코드를 더 빠르게 실행하는 이점을 얻을 수도 있습니다.
-f
당신이 찾고 있는 패턴 파일입니다. 따라서 N 패턴을 완전히 N 스캔하는 대신 한 번에 모두 수행할 수 있습니다. 이는 너무 커서 RAM에 들어갈 수 없는 파일의 속도도 크게 향상됩니다.
검색하려는 파일을 빠른 디스크에 넣으십시오. grep은 매우 선형적인 방식으로 스캔하므로 일반 회전 디스크에 적합하고 디스크 어레이가 있는 경우 특히 빠릅니다.
두 스위치의 조합과 하드 드라이브의 속도로 인해 grep이 매우 빨라질 수 있습니다. 데이터가 매우 반복적이라면(압축성이 좋음) gzip 형식으로 저장하고 zgrep을 사용하여 검색해 볼 수 있습니다. 이는 저장 공간이 특별히 빠르지 않은 경우에 유용합니다.
데이터가 파일에 저장되는 방식을 담당하는 경우에는 항목을 작게 유지하십시오. 구조 공간을 너무 많이 낭비하지 말고 정보를 전달하지 않는 데이터(예: UUID 내부 또는 XML 태그 사이의 공백 및 줄 바꿈)를 제거하여 로그를 더 작게 만드십시오. 그러면 디스크 읽기 시간과 구문 분석 시간이 줄어듭니다. 시간은 더 짧습니다.
때로는 이중 구문 분석을 수행하는 것이 실제로 더 빠릅니다. 이는 데이터 의존도가 높습니다. 예를 들어, 구문 분석하기 복잡하지만 몇 가지 항목에만 표시되고 구문 분석하기 쉬운 다른 표현식으로 쉽게 식별할 수 있는 데이터 조각을 찾고 있는 경우 단순 표현식에 대해 첫 번째 전달을 수행합니다. 이렇게 하면 느리거나 복잡한 표현식을 실행하는 데 필요한 데이터가 줄어듭니다.
그래도 도움이 되지 않으면 split -l
파일을 grep
만들고 parallel
. 여러 디스크에서 대용량 파일을 더 작은 파일로 분할할 수 있다면 검색 속도가 더 빨라질 수 있습니다.
사람들이 저지르는 일반적인 실수는 분할된 파일을 램디스크에 넣으려고 하는 것입니다. 캐싱을 하고 있는 셈이군요. OS는 전체 파일보다는 실제로 작업 중인 내용을 캐시하기 위해 동일한 양의 메모리를 사용하여 더 나은 작업을 수행할 가능성이 높습니다.
또한 다양한 시나리오에서 작업하면서 CPU 및 디스크 활동을 모니터링하고 "병목 현상"과 "포화"의 차이를 이해하고 싶을 것입니다.
답변3
기반으로http://www.gnu.org/software/parallel/man.html#EXAMPLE:-Grepping-n-lines-for-m-regular-expressions
parallel -k parallel --pipepart --block 100M -a file2 -k grep {} :::: file1
더 쉽고 더 빠를 수도 있습니다.
parallel -j0 -k grep {} file2 :::: file1