25GB의 텍스트 파일이 있는데 몇 줄의 문자열만 바꾸면 됩니다. 성공적으로 사용할 수는 있지만 sed
실행하는 데 시간이 오래 걸립니다.
sed -i 's|old text|new text|g' gigantic_file.sql
이 작업을 수행하는 더 빠른 방법이 있나요?
답변1
당신은 시도 할 수 있습니다:
sed -i '/old text/ s//new text/g' gigantic_file.sql
따라서인용하다:
속도 최적화: 실행 속도를 높여야 하는 경우(입력 파일이 크거나 프로세서나 하드 디스크가 느려서) "s/.../.find" 표현식이 제공되기 전에 "find" 표현식이 지정된 경우 교체가 더 빠르게 진행됩니다. ../" 지침.
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
답변2
짧은 대답은 "아니요"입니다. 이러한 유형의 작업에 대한 제한 요소는 디스크 IO입니다. 25GB 디스크를 더 빠르게 전송할 수 있는 방법은 없습니다. 제자리에서 편집하지 않고 결과를 sed
별도의 드라이브(사용 가능한 경우)에 기록하면 약간의 개선을 얻을 수 있습니다. 그러면 한 드라이브에서 읽을 수 있고 다른 드라이브에 쓸 수 있으므로 경합이 약간 줄어듭니다. 조금.
너가능한모든 라인에 대해 정규식 엔진을 사용하지 않음으로써 작업 속도를 높일 수 있습니다. 예를 들어 Perl을 사용하는 경우(할 수 있다고 확신 sed
하지만 구문은 모릅니다.) 이는 라인 10,000에서 시작하여 앞으로 진행됩니다.
perl -pe '$. > 10_000 && s/old_text/new_text/g'
RE(메타 문자)에 어떤 종류의 합병증이 있는 경우 이러한 문제를 최소화하십시오.약간정규식 엔진의 효율성을 향상시킵니다.
답변3
이전 텍스트와 새 텍스트의 길이가 같은 경우 파일 전체를 복사하는 대신 파일을 찾아서 변경된 바이트만 쓸 수 있습니다. 그렇지 않으면 많은 양의 데이터를 이동하는 데 어려움을 겪게 됩니다.
참고: 이 작업은 까다로우며 사용자 지정 코드를 작성해야 합니다.
시스템 호출을 검색하고 작성하기 위해 C나 C++ 또는 선호하는 언어 래퍼를 사용하는 경우 fseek 매뉴얼 페이지를 참조하세요.
명령줄만 사용하려고 하고 텍스트의 바이트 오프셋을 얻을 수 있는 경우 신중하게 작성된 "dd" 명령을 사용하여 대체 텍스트를 제자리에 쓸 수 있습니다.