awk 메모리 누수?


11

베이스에 나는 명령을 실행 해요

< /dev/urandom hexdump -v -e '/1 "%u\n"' |
awk '{ split("0,2,4,5,7,9,11,12",a,",");
       for (i = 0; i < 1; i+= 0.0001)
         printf("%08X\n", 100*sin(1382*exp((a[$1 % 8]/12)*log(2))*i)) }' |
xxd -r -p |
sox -traw -r44100 -b16 -e unsigned-integer - -tcoreaudio

이 명령이 실행되는 동안 awk가 사용하는 메모리가 지속적으로 커지는 것을 알 수 있습니다. 예를 들어 75MB의 원시 오디오 데이터가 재생 될 때 500MB 이상의 메모리를 소비합니다. 파이프 라인의 다른 모든 명령은 일정한 양의 메모리를 유지 관리합니다.

이 메모리를 사용하는 awk는 무엇이며 일정한 양의 메모리 만 사용하여 의도 된 스트림 처리를 수행하는 대안이 있습니까?


awk 버전이 중요한 경우 :

 awk --version
awk version 20070501

Thomas Dickey의 답변을 기반으로 테스트 한 명령은 다음과 같습니다.

< /dev/urandom hexdump -v -e '/1 "%u\n"' |
awk 'BEGIN { split("0,2,4,5,7,9,11,12",a,",") }
           { for (i = 0; i < 1; i+= 0.0001)
               printf("%08X\n", 100*sin(1382*exp((a[$1 % 8]/12)*log(2))*i)) }' |
xxd -r -p |
sox -traw -r44100 -b16 -e unsigned-integer - -tcoreaudio

또한 BSD-Darwin (Mac) 시스템에서 메모리 누수가 발생합니다.
Otheus

당신은 말했다 Here's the command I tested...그러나 당신은 우리에게 그 테스트의 결과를 말하는 것을 잊었다 – 그것이 문제를 해결 했는가? a[]루프 에있는 요소에 대한 모든 참조가 존재하지 않으면 항목을 생성하지 않을 수 있으므로 존재하지 않는 경우-분할하기 전에 또는 사용 후 배열을 명시 적으로 삭제하면 도움이됩니다 (예 : awk '{ delete a; split("0,2,4,5,7,9,11,12",a,","); for (i = 0; i < 1; i+= 0.0001) printf("%08X\n", 100*sin(1382*exp((a[$1 % 8]/12)*log(2))*i)) }'? 해당 코드 세그먼트를 사용하면 split ()을 원래 위치에 그대로두고 BEGIN으로 이동하지 않아야합니다.
Ed Morton

답변:


11

이 진술은 이상하다 :

split("0,2,4,5,7,9,11,12",a,",");

상수 문자열을 반복적으로 분할하여 배열을 만듭니다 a. 이 BEGIN섹션을 섹션 으로 이동하면 a각 입력 레코드에 대해 새 어레이 사본을 할당하지 않고 프로그램이 동일하게 작동해야합니다 .

주석 처리 : for-loop와 expression은 단순한 방식으로 메모리를 할당하지 않습니다. mawk, gawk 및 awk를 빠르게 비교하면 처음 두 개에는 문제가 없지만 /usr/bin/awkOSX에서는 빠르게 누출됩니다. Apple에 버그보고 시스템이 있다면 그 곳을 방문하십시오.


1
나는 당신이 내 Mac에서 제안한대로했습니다 (OP가 아닙니다). 여전히 awk로 메모리 누수가 발생합니다.
Otheus

어떻게 든, 단순히 참조 해시 사용하는 메모리.
Otheus

여기에서도 마찬가지입니다. 나는 여전히 메모리 증가를 봅니다. 또한 대략적인 비교를 수행 했으며이 변경으로 메모리 사용량이 같은 속도로 증가하고있는 것 같습니다.
bames53

이 경우에도 메모리 누수가 발생할 수 있습니다.awk 'BEGIN { split("0,2,4,5,7,9,11,12",a,","); } { for (i = 0; i < 1; i+= 0.0001) a[1]; }'
Otheus

mawk 또는 gawk로 전환 할 수 있습니다. Apple의 기본 시스템에는 실제 골동품이 포함되어 있습니다.
Thomas Dickey

5

누출되지 않는 펄 동등 물은 다음과 같습니다.

perl -lne 'BEGIN { @a=(0,2,4,5,7,9,11,12);}
   for ($i = 0; $i < 1; $i+= 0.0001) {
     printf("%08X\n", 100*sin(1382*exp($a[$F[0] % 8]/12)*log(2))*$i) }'

거의 동일합니다. $1로 대체됩니다 $F[0]i대체됩니다 $i. 해시 a는 실제 배열로 대체됩니다 @a.

약간의 입력을 생성하고 출력을 비교하고 둘 사이의 차이를 기록하는 것이 현명합니다. 해석 언어가 부동 소수점을 처리하는 방법에 대한 뉘앙스가 종종 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.