Распределение памяти для разреженного массива в awk

Я искал, но не дошел до какого-либо вывода, что, когда я определял разреженный массив, он резервирует всю непрерывную память до максимального индекса или выделяет память только по этому конкретному индексу.

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

Точно так же, когда я делаю для цикла для массива, он просматривает все индексы, где существует массив [i], или указывает только индекс определенного массива для ex. 100000 и 1001.

 for(i in array){...} 

Я должен хранить некоторое значение по определенному индексу, но я боюсь выделения памяти, поэтому мне стало так важно знать: как он на самом деле выделяет память в случае разреженного массива?

  • Замените шаблон в файле длинной строкой
  • Почему awk выполняет полную буферизацию при чтении из трубы
  • Разделите элементы столбца на столбец с одним элементом
  • Ошибка сепаратора поля Awk?
  • Как преобразовать поля фиксированной длины в файл в пространство с разделителями
  • Как выводить сравнение значений в отдельных файлах
  • awk высокоточная арифметика
  • Разбор файла в соответствии с парой идентификаторов и более высокими значениями ниже
  • 2 Solutions collect form web for “Распределение памяти для разреженного массива в awk”

    В руководстве gawk , которое является хорошей общей ссылкой на awk :

    Важным аспектом, который следует помнить о массивах, является то, что индексы массива всегда являются строками.

    То есть, awk массивы всегда ассоциативны , а числовые клавиши стробируются. Только используемые ключи хранятся в массиве (и, возможно, некоторое дополнительное пространство для будущего). Числовые индексы не смежны, поэтому разреженные массивы не занимают больше места, чем другой массив с одинаковым количеством элементов.

    Что касается циклов, то при использовании синтаксиса for (k in array) {body} :

    loop выполняет тело один раз для каждого индекса в массиве , который ранее использовала программа

    Опять же, только те индексы, которые были использованы, будут включены в итерацию массива. Обратите внимание, что порядок итераций не определен , однако; это не обязательно либо числовое, либо порядок добавления в массив.

    С gawk , со своей страницы man о массивах , вы можете прочитать подробное объяснение.

    В большинстве других языков массивы должны быть объявлены перед использованием, включая спецификацию количества элементов или компонентов, которые они содержат. В таких языках объявление приводит к тому, что для этого множества элементов выделяется смежный блок памяти . Обычно индекс в массиве должен быть положительным целым числом. Например, нулевой индекс указывает первый элемент в массиве, который фактически хранится в начале блока памяти. Index one указывает второй элемент, который хранится в памяти сразу после первого элемента и так далее. Невозможно добавить в массив больше элементов, поскольку в нем есть место только для количества элементов, указанных в объявлении. (Некоторые языки допускают произвольные начальные и конечные индексы, например, «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 hash очень похож на массив gawk :

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

    Поскольку массивы gawk реализуются как хеш-таблица, вы можете получить доступ к любому элементу массива в постоянное время, независимо от размера массива.

    Interesting Posts

    Есть ли более простой способ манипулировать данными GRUB 2?

    Зачем компенсировать конкретную установку контура?

    Как искать «(+1)» подстроку символов в строке

    Почему для перезагрузки и отключения питания требуются привилегии root?

    Команда ls: что означает первая строка?

    Установщик Oracle Server не позволяет ввести значение в поле

    У BSD и SunOS многопотоковая архитектура?

    Как сделать подсказку с каждым нажатием клавиши / символом?

    как получить открытый ключ Cisco IOS для автоматического подключения scp

    Как подсчитать, сколько разных слов у меня есть в файле, в столбце

    Возможно ли иметь общее количество нет. блоков, снятых одними и теми же файлами, будут отличаться на двух ПК?

    vim: используйте строку из поиска в команде replace

    Как отправить команды SGD на USB-принтер?

    Mac: самый простой способ перемещения нескольких дубликатов имен файлов в один каталог

    Можно ли показать, как работает бас-глобус?

    Linux и Unix - лучшая ОС в мире.