awkのスパース配列のメモリ割り当て

awkのスパース配列のメモリ割り当て

検索しましたが、どの結論も下げませんでした。スパース配列を定義すると、すべての項目が保持されますか?連続メモリ最大インデックスまでのみ割り当てるか、そのインデックスにのみメモリを割り当てます。

array[100000]="ID1"
array[1001]="ID2"

同様に、配列に対して for ループを実行すると、配列のすべてのインデックスが検索されます。配列[i]が存在しますまたはそれだけを指す配列のインデックス定義例えば。 100000と1001。

for(i in array){...}

特定のインデックスにどの値を格納する必要がありますが、メモリ割り当てが心配されるため、スパース配列の場合、実際にどのようにメモリを割り当てるかを理解することが非常に重要です。

答え1

~によるとgawk手動、これは良い一般awk言語参照です。

配列について覚えておくべき重要な側面は次のとおりです。配列添字は常に文字列です。

つまり、awk配列は常に関連付けられている、数字キーが文字列として表示されます。使用されるキーのみが配列に保存されます(後で使用する余分なスペースもあります)。数値インデックスは連続的ではないため、希少配列は、同じ数の要素を持つ他の配列よりも多くのスペースを占有しません。

ループの場合、for (k in array) {body}文法これ:

ループの実行インデックスごとに1回大量にこのプログラムは以前に使用されたことがあります。

同様に、使用されたインデックスのみが配列反復に含まれます。気づく繰り返し順序が定義されていません。ただし、必ずしも配列に追加される数値や順序ではありません。

答え2

gawkマンページから関連ソート、詳細な指示を読むことができます。

他のほとんどの言語では、配列に含まれる要素やコンポーネントの数に関する仕様など、配列を使用する前に宣言する必要があります。そのような言語ではこの宣言により、対応する多くの要素に連続したメモリブロックが割り当てられます。。通常、配列のインデックスは正の整数でなければなりません。たとえば、インデックス0は、実際にメモリブロックの先頭に格納される配列の最初の要素を指定します。インデックス1は、メモリ内の最初の要素の直後に格納される2番目の要素を指定します。宣言に指定された要素数だけスペースがあるため、配列にさらに要素を追加することは不可能です。 (一部の言語では、「15 .. 27」などのランダムな開始インデックスと終了インデックスを受け入れますが、配列宣言時の配列のサイズはまだ固定されています。)

....

awkの配列は異なります。関連しています。。つまり、すべての配列は、インデックスと対応する配列要素値のペアの集合です。

したがって、サイズを指定せずに配列を定義できます。

$ awk 'BEGIN{a[0]=1;a[10]=2;print length(a)}'
2

perl連続したメモリブロックを使用して配列を保存するのとは異なります。

$ perl -le '$a[0]=1;$a[10]=1;print ~~@a'
11

ハッシュは配列とperl非常によく似ていますgawk

$ perl -le '$a{0}=1;$a{10}=1;print ~~keys %a'
2

配列はハッシュテーブルとして実装されているため、配列のgawkサイズに関係なく、一定の時間に配列のすべての要素にアクセスできます。

関連情報