grep 명령이 있습니다
grep -Fvf cleaned1 cleanedR > cleaned2
너무 많은 메모리를 사용하여 컴퓨터를 실행하고 종료합니다.
- cleanR은 파일 목록(1,400만 개)이며 dowork.sh cleanR을 통해 무언가를 실행해야 하며 완료된 모든 작업은 clean1에 인쇄됩니다(다른 정렬 순서로 되어 있으므로 diff가 작동하지 않음).
- clean1은 파일 목록입니다(1,000만).
- 다른 작업을 수행하기 위해 dowork.sh 작업을 취소해야 했지만 나중에 다른 목록(dowork.sh clean2)을 통해 다시 시작할 수 있었습니다. clean2는 아직 존재하지 않습니다
- clean2는 4백만 개의 파일 목록이 될 것입니다. 아직 dowork.sh를 실행하지 않았습니다.
- 기본적으로 다음 계산을 수행해야 합니다(뺄셈 연산). 정리된 파일 목록 R - 정리된 파일 목록 1 = 정리된 파일 목록 2
clean1 및 cleanR은 절대 파일 구조를 포함하는 파일이며 수백만 개의 파일이 있으며 이는 대용량 파일입니다. clean1은 1.3G이고 cleanR은 1.5G입니다.
약 30G의 여유 메모리가 있었지만 메모리를 모두 사용하여 충돌이 발생했습니다.
여기서 grep이 왜 ram을 사용하는지 궁금합니다. ram이 다른 임시 디렉토리를 사용하도록 할 수 있나요? 정렬에는 -T 옵션이 있습니다. 그래서 나는 grep과 비슷한 방법을 찾고 있습니다.
나는 다른 아이디어에 열려 있습니다.
-f는 문자열 정규 표현식 대신 수백만 개의 표현식(파일 이름)으로 clean1을 실행합니다. 한 줄에 1개의 파일 -F는 해당 줄에서 정확히 일치합니다. 파일 이름은 복잡할 수 있고 grep은 일부 문자를 우리가 원하지 않는 정규식 문자로 착각할 수 있으므로 전체 줄 일치를 수행합니다. -v는 빼기/제거 연산입니다.
답변1
먼저, 가상 행은 cleaned1
의 전체 행과 일치해야 하며 cleanedR
, 이를 사용하면 이점을 얻을 수 있습니다 grep -x
.
동일한 가정으로, cleaned1
두 개의 큰 파일 및 을 정렬 할 수 있다면 which를 which 로 대체 cleanedR
할 수 있으며 상당히 빠를 것입니다.grep
comm -1 -3 cleaned1 cleanedR
그렇지 않으면 분할 cleaned1
(예 split -l 100000
: )하여 청크로 수행할 수 있습니다. 이러한 grep(예: greps grep -Fvxf chunk1 cleanedR | grep -Fvxf chunk2 | ... > cleaned2
)을 연결하여 여러 CPU에서 병렬화 할 수도 있습니다 .