Perl Language
메모리 사용 최적화
수색…
파일 읽기 : foreach vs. while
잠재적으로 큰 파일을 읽을 때 while
루프는 foreach
보다 중요한 메모리 이점 foreach
집니다. 다음은 레코드별로 파일 레코드를 읽습니다 (기본적으로 "레코드"는 $/
로 지정된 "라인"을 의미합니다). 각 레코드는 $_
할당되어 읽습니다.
while(<$fh>) {
print;
}
다이아몬드 연산자 는 루프가 "0"문자 만 포함하는 줄 끝과 같은 파일 끝에서만 종료되도록하기 위해 여기에서 마술을 사용합니다.
다음 루프는 똑같이 작동하지만 목록 컨텍스트에서 다이아몬드 연산자를 평가하므로 전체 파일을 한 번에 읽을 수 있습니다.
foreach(<$fh>) {
print;
}
어쨌든 한 번에 하나의 레코드로 작업하는 경우 엄청난 낭비가 될 수 있으므로 피해야합니다.
긴 목록 처리 중
메모리에 이미 목록이있는 경우 간단하고 일반적으로 처리 할 수있는 방법은 간단한 foreach
루프입니다.
foreach my $item (@items) {
...
}
이것은 $item
에 대해 몇 가지 처리를 한 다음 데이터를 유지하지 않고 파일에 쓰는 일반적인 경우에 유용합니다. 그러나 항목에서 다른 데이터 구조를 구축하면 while
루프가 더 효율적입니다.
my @result;
while(@items) {
my $item = shift @items;
push @result, process_item($item);
}
$item
대한 참조가 결과 목록에서 직접 끝나지 않는 한 다음 루프 반복을 입력 할 때 @items
배열에서 이동 한 항목을 해제하고 인터프리터가 메모리를 다시 사용할 수 있습니다.
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow