25GB 텍스트 파일이있어 몇 줄로만 문자열을 교체해야합니다. sed
성공적으로 사용할 수 있지만 실행하는 데 시간이 오래 걸립니다.
sed -i 's|old text|new text|g' gigantic_file.sql
더 빠른 방법이 있습니까?
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
sed
철자가 잘못되었습니다. 나는 마지막으로 수정 어제이 기사를 편집 sed
해야 명령 time sed -i '/original/ s//ketan/g' wiki10gb
하지를 time sed -i '/ketan/ s//original/g' wiki10gb
. 1. 시간이 더 이상 명령과 일치하지 않고 2 + 3GB 파일에서 GNU sed로 동일한 테스트를 수행했으며 두 sed
대안 사이의 차이점을 관찰하지 못하기 때문에 오늘 편집 내용을 되돌 립니다. 시간의 차이는 철자가 틀린 것 같습니다.
time
개인적으로 결과 에서 많은 변동을 보았지만 결국에는 시간의 차이가 없었습니다.
짧은 대답은 "아니오"입니다. 이러한 종류의 작업에 대한 제한 요소는 디스크 IO입니다. 25GB의 디스크를 더 빠르게 스트리밍 할 수있는 방법이 없습니다. 제자리에 편집하지 않으면 약간의 개선이있을 수 있으며 결과를 sed
별도의 드라이브에 씁니다 (사용 가능한 경우). 다른 방식으로 쓰거나 약간 쓰는 동안 하나에서 읽을 수 있기 때문입니다. 결과적으로 적은 경합.
각 줄에 정규식 엔진을 사용하지 않으면 속도를 높일 수 있습니다 -예를 들어 perl을 사용하십시오 (이 작업을 수행 할 수는 sed
있지만 구문을 모릅니다)-시작부터 10,000 줄 이상.
perl -pe '$. > 10_000 && s/old_text/new_text/g'
그리고 RE (메타 문자)에 어떤 종류의 합병증이있는 경우이를 최소화 하면 정규식 엔진의 효율성 이 약간 향상 됩니다 .
sed -i '10000,$ s/old_text/new_text/g'
sed
비교 방법을 모르겠습니다 . 파일 크기 때문에 조금 더 빠르다고 가정합니다.
sed
있는 perl
, 그러나 후자는 또한 당신이 너무 스크립트 자세한 더 작성할 수 있습니다.