매우 큰 파일의 텍스트를 빠르게 교체

매우 큰 파일의 텍스트를 빠르게 교체

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" 명령을 사용하여 대체 텍스트를 제자리에 쓸 수 있습니다.

관련 정보