25GB 텍스트 파일이있어 몇 줄로만 문자열을 교체해야합니다. sed
성공적으로 사용할 수 있지만 실행하는 데 시간이 오래 걸립니다.
sed -i 's|old text|new text|g' gigantic_file.sql
더 빠른 방법이 있습니까?
답변
당신은 시도 할 수 있습니다:
sed -i '/old text/ s//new text/g' gigantic_file.sql
이 심판에서 :
속도 최적화 : 큰 입력 파일이나 느린 프로세서 또는 하드 디스크로 인해 실행 속도를 높여야하는 경우 “s /…/를주기 전에”찾기 “식을 지정하면 대체가 더 빨리 실행됩니다. ../ “명령.
다음은 10G 파일을 비교 한 것입니다. 전에:
$ time sed -i 's/original/ketan/g' wiki10gb
real 5m14.823s
user 1m42.732s
sys 1m51.123s
후:
$ time sed -i '/ketan/ s//original/g' wiki10gb
real 4m33.141s
user 1m20.940s
sys 1m44.451s
답변
짧은 대답은 “아니오”입니다. 이러한 종류의 작업에 대한 제한 요소는 디스크 IO입니다. 25GB의 디스크를 더 빠르게 스트리밍 할 수있는 방법이 없습니다. 제자리에 편집하지 않으면 약간의 개선이있을 수 있으며 결과를 sed
별도의 드라이브에 씁니다 (사용 가능한 경우). 다른 방식으로 쓰거나 약간 쓰는 동안 하나에서 읽을 수 있기 때문입니다. 결과적으로 적은 경합.
각 줄에 정규식 엔진을 사용하지 않으면 속도를 높일 수 있습니다 -예를 들어 perl을 사용하십시오 (이 작업을 수행 할 수는 sed
있지만 구문을 모릅니다)-시작부터 10,000 줄 이상.
perl -pe '$. > 10_000 && s/old_text/new_text/g'
그리고 RE (메타 문자)에 어떤 종류의 합병증이있는 경우이를 최소화 하면 정규식 엔진의 효율성 이 약간 향상 됩니다 .
답변
새 텍스트와 기존 텍스트의 길이가 같은 경우 전체 파일을 복사하는 대신 파일을 찾아서 변경된 바이트 만 쓸 수 있습니다. 그렇지 않으면 많은 양의 데이터가 이동 될 수 있습니다.
참고 : 이것은 까다 롭고 사용자 정의 코드 작성과 관련이 있습니다.
C 또는 C ++로 작업하고 있거나 검색 및 쓰기 시스템 호출을 위해 선호하는 언어 래퍼 인 경우 fseek 맨 페이지를 참조하십시오.
명령 행 만 사용하고 텍스트의 바이트 오프셋을 얻을 수있는 경우 신중하게 작성된 “dd”명령으로 대체 텍스트를 작성할 수 있습니다.