베이스에 이 나는 명령을 실행 해요
< /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
당신은 말했다
—
Ed Morton
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으로 이동하지 않아야합니다.