Распределение памяти для разреженного массива в 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 или sed
  • grep и добавить его в конец строки
  • присоединяйте два файла на основе столбца, когда в сценарии bash нет взаимно однозначного соответствия (awk, grep, sed)
  • Как присоединиться к строкам с одиночными столбцами максимум до 4 столбцов в одной строке?
  • Нарушение оператора awk при поиске шаблона в файле
  • Использование awk как простого механизма шаблонов, как изменить вывод последней строки из getline
  • Сравнение двух файлов с использованием Unix и Awk
  • Согласование шаблонов по нескольким строкам
  • Использование tee для добавления строки в файл, а также использовать ее в качестве замены шаблона в другом файле
  • Сравните второй столбец 1-го файла и 1-й столбец второго файла и распечатайте сопоставленные записи 1-го файла
  • Вырезать определенную часть столбца из файла csv
  • Interesting Posts

    Полностью отключите режим ожидания / спящего режима на Fedora 21

    Установка libconfig без root

    Передача ssh X11

    Как мне сделать окно командной строки tmux пустой по умолчанию?

    Приоритет драйвера устройства

    Debian 8.6 – Большой файл в корневой папке с именем EMPTY

    phpmyadmin перечисляет версию моего сервера и версию клиента как отличающуюся

    Как загрузить архив и извлечь его, не сохраняя архив на диск?

    Яркость экрана возвращается к максимальному после возврата с дисплея `xset dpms` suspend

    cpio VS tar – какое лучшее решение для архивации, чтобы сжать сотни каталогов в один файл

    Можно ли конвертировать RHEL в CentOS?

    Основы работы в сети: какой IP-адрес назначен сетевому адаптеру, если нет успешных переговоров по DHCP?

    Как искать определенные разделы файла, а затем извлекать только соответствующую информацию в этом разделе?

    Как получить физическое (синхронизированное) использование диска, игнорируя системный кеш?

    Символическая ссылка не работает так, как ожидалось при изменении пользователя

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