
각각 300MB 크기의 파일이 약 3,000개 있는데, 16개 코어 서버에서 가능한 한 빨리 일련의 하위 문자열을 검색하고 싶습니다.
이것이 내가 시도한 것이지만 파일 검색을 병렬화하지 못하는 것 같습니다.
sudo find /mnt2/preprocessed/preprocessed/mo* | sudo xargs awk '/substring/ {c++} END {print c}' | paste -sd+ | bc
여러 가지 방법으로 붙여넣은 것인데, 완전히 이해가 되지 않습니다. 파일 처리를 분할하는 방법에 대한 제안 사항이 있습니까?
답변1
parallel
시스템에 프로그램이 있는지 확인하십시오 . (GNU에서 올 수도 있습니다.) 그렇다면 어떻게 사용하는지 알아보세요. 그렇지 않으면,find
파일로 출력하여 실행하십시오 . 텍스트 편집기나 와 같은 도구를 사용하는 스크립트를 사용하여head
해당 파일을 (대략) 동일한 수의 행(즉, 동일한 수의 발견된 파일 참조)이 있는 16개의 조각 파일로 분할합니다. 그런 다음 16개의awk … | paste … | bc
파이프라인을 시작합니다. 각 조각 파일마다 하나씩. (그리고 16개의 결과를 추가합니다.)
특별히 설계된 awk
문자열의 발생 횟수를 계산하는 데 사용하는 이유가 궁금합니다 .grep -c
답변2
GNU 병렬은 xargs와 꽤 호환되므로 귀하의 경우 이를 대체할 수 있습니다. substring
사용 횟수만 계산하는 grep -c
경우스캇제안:
sudo find /mnt2/preprocessed/preprocessed/mo* |
sudo parallel grep -c source | paste -sd+ | bc
일부 GNU/Linux 버전은 "Tollef 병렬" 호환 모드에서 GNU 병렬을 설치합니다. --gnu
명령줄 인수를 병렬로 추가하여 이를 변경할 수 있습니다 . 변경 사항을 영구적으로 적용하려면 --gnu
에 추가하세요 ~/.parallel/config
.