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

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

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

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

 for(i in array){...} 

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

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 реализуются как хеш-таблица, вы можете получить доступ к любому элементу массива в постоянное время, независимо от размера массива.

  • awk системный вызов с инвертированным эффектом
  • использовать awk для замены скобок?
  • Использовать awk для форматирования даты и времени.
  • Как записывать данные по одному из файлов tmp в конечный выходной файл, используя для цикла?
  • Как я могу отфильтровать определенные команды из многострочной истории Bash при выходе из системы?
  • Совмещение двух основных столбцов одновременно между файлами и вставка дополнительных столбцов в выходной файл, когда эти основные столбцы соответствуют
  • разница между и паттерном в команде awk
  • Как читать и делать min / max / avg из потока NMEA
  • Как извлечь значения, которые меньше 0 и точка из определенных столбцов, и распечатать всю строку с помощью awk
  • Использование переменной bash с escape-символом в awk для извлечения строк из файла
  • Не удается выполнить команду для определенного столбца с gawk
  • Interesting Posts

    Улучшить команду sed для замены первого экземпляра символа и всех следующих символов?

    Как найти файлы в поддирерах и отсортировать их по имени файла в одной команде?

    tr -d не работает с возвратом каретки

    / etc / sysconfig / iptables: как заблокировать все, кроме портов 80 и 22?

    Как удалить определенную строку и следующую пустую строку с помощью GNU sed?

    Не работает ли sysctl kern.bufcachepercent в OpenBSD 5.2 выше 1,7 ГБ?

    Как скомпилировать модуль DKMS для нескольких версий образа ядра в Debian?

    Создание из источника на CentOS 5 или новее

    Создайте команду для исполняемого файла Linux

    Как определить ключ Compose в терминале (нет среды рабочего стола)?

    Как использовать Crontab для java-файла в Linux

    VNC-сервер: отключить локальный экран при подключении удаленного клиента VNC

    Chown и риск повреждения резервного диска

    Увеличение столбца каждый раз, когда выполняется скрипт

    создайте новый столбец на основе существующих столбцов, используя оператор else в awk

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