대용량 파일 (잠재적으로 1.5GB)에 매우 긴 행이있을 경우 대용 암호를 사용해야합니다. 나는 슬라이딩 윈도우를 실행하여 파일에서 12,4096 바이트를 가져다가 이전 청크에 추가하고 대체한다고 생각했지만, 물론 대체가 폴드 겹쳐 질 수있는 대체를 위해 그렇게 잘 작동하지 않습니다.대용량 파일에 대한 정규 표현식 대체
다른 생각으로는 처음 두 개의 청크부터 시작하여 s///
을 시작할 수 있습니다. 대체가 없다면 chunk1을 디스크에 쓰고 chunk3을 붙입니다. 그렇다면 나는 s///
(청크 2와 청크 3)입니다. 하위가 있다면 chunk4를 붙잡아 추가합니다. 그런 다음 하위 항목이 없어 질 때까지 계속 추가합니다. 그 시점에서 나는 디스크에 최신 덩어리를 제외한 모든 것을 기록합니다. 좋아요 :
read($data, $previous_chunk, 4096);
while(read($data, $this_chunk, 4096) > 0){
my $chunk = $previous_chunk . $this_chunk;
if(0 == $chunk =~ s/foo/bar/g){
# There was nothing to substitute, so we'll append all
# the old stuff to our file and just keep the latest chunk.
print OUTPUT $previous_chunk;
$previous_chunk = $this_chunk;
}
else {
# There was a substitution, so we want to keep building
# in case it crossed the fold
$previous_chunk .= $this_chunk;
}
}
정상적으로 들리니? 내가 볼 수있는 유일한 문제는 대체가 실행 중에 새로운 일치가 발생하면 $previous_chunk
입니다. 따라서 우리는 대체적으로 최신 대체품까지 $previous_chunk
을 지우고 그 뒤를 이어 깨끗한 콘텐츠 만 유지해야 할 것입니다. 예를 들어 우리가 s/foo/foobar/
이라면 'foo'를 'foobar'로 바꾼 다음 'foobarbar'로 'foobarbarbar'로 바꿀 것입니다. 그것을 할 수있는 더 좋은 방법이 있는지
메모리 용량은 얼마나 되나요? 전체 파일을 메모리로 읽어 들이고 대체를 수행하고 다시 쓸 수 있습니까? 그것은 큰 망치이지만, 당신의 목적을 위해 작동 할 수도 있습니다. –
대체품의 특성에 따라 다릅니다. Greg가 지적했듯이 전체 파일을 메모리에로드하는 것이 가능할 수도 있습니다. 그러나 많은 사람들이 내부 라인 교체 만하기 때문에 수행중인 번역 유형에 따라 간단한 라인 단위 처리가 작동 할 수 있습니다. 결국 더 많은 조언을 할 수있는 더 많은 데이터가 필요합니다. – Miller
얼마나 오래입니까? 귀하의 모든 대체물은 한 줄로 작업하기에 적합합니까? – ysth