これに基づいて、コマンドを実行しています
< /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
トーマスディッキーの答えに基づいてテストしたコマンドは次のとおりです。
< /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 2016年
あなたは言った
—
エド・モートン
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に移動するのではなく、元の場所に残す必要があります。