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}문법이것:

루프 실행인덱스당 한 번대량으로이 프로그램은 이전에 사용된 적이 있습니다.

마찬가지로, 사용된 인덱스만 배열 반복에 포함됩니다. 알아채다반복 순서가 정의되지 않았습니다.그러나 반드시 배열에 추가되는 숫자나 순서는 아닙니다.

답변2

gawk맨페이지에서 와 관련됨정렬, 자세한 지침을 읽을 수 있습니다.

대부분의 다른 언어에서는 배열에 포함된 요소나 구성 요소 수에 대한 사양을 포함하여 배열을 사용하기 전에 선언해야 합니다. 그러한 언어에서는이 선언으로 인해 해당 많은 요소에 연속된 메모리 블록이 할당됩니다.. 일반적으로 배열의 인덱스는 양의 정수여야 합니다. 예를 들어 인덱스 0은 실제로 메모리 블록의 시작 부분에 저장되는 배열의 첫 번째 요소를 지정합니다. 인덱스 1은 메모리에 첫 번째 요소 바로 다음에 저장되는 두 번째 요소를 지정합니다. 선언에 지정된 요소 수만큼만 공간이 있으므로 배열에 더 많은 요소를 추가하는 것은 불가능합니다. (일부 언어에서는 "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배열 크기에 관계없이 일정한 시간에 배열의 모든 요소에 액세스할 수 있습니다.

관련 정보