Intereting Posts

Хранение более длинного текстового вывода в памяти в переменных оболочки vs Запись на диск

У меня есть нижний вызов инструмента командной строки базы данных db2 внутри цикла, который запускает итерации 100 КБ.

(выход из db2 составляет 5 строк по 20 символов на каждый вызов, всего около 100 тыс. вызовов. Вход в SP префикс к выходной строке из SP и сбрасывается в файл журнала.)

while read line do db2 -x "call stored_procedure_XYZ($line)" |sed "s/^/$line/" >>log_file.txt done<$infile 

Я стараюсь, чтобы все это выполнялось быстрее, вынимая sed и диск изнутри. Целесообразно хранить весь вывод в переменной, а затем модифицировать и записать его на диск?

Какова будет длина переменной оболочки?

(bash, aix 6.1)

Размер переменной Bash не является фиксированным. Очень вероятно, что произвольные объемы данных сохраняются до тех пор, пока malloc может найти достаточную память и непрерывное адресное пространство. Предположим, вы сохранили большой объем данных в своей переменной. Когда вы пытаетесь записать данные на свою файл, возможно, вы получите ошибку примерно так

 /bin/echo ${LARGE_DATA} >> ${YourFile} /bin/echo: Argument list too long 

Эта ошибка связана с максимальной длиной аргумента команды. Проверьте лимиты на размер аргументов и раздел среды, который указан на странице execve man http://man7.org/linux/man-pages/man2/execve.2.html.

«… память, используемая для хранения строк окружения и аргументов, была ограничена 32 страницами (определенными константой ядра MAX_ARG_PAGES). На архитектурах с размером страницы 4 КБ это дает максимальный размер 128 КБ …»

РЕДАКТИРОВАТЬ:

Также обратите внимание, что приведенная выше ошибка для / bin / echo является просто примером, и вы можете получить аналогичную ошибку, когда вы пытаетесь использовать другие способы при записи файла. Это размер аргумента.

ПРЕДЛОЖЕНИЕ:

Если мы думаем, что запись в файловые операции атомарно, каждый раз, когда труба генерируется для записи, дескрипторы файлов открываются и закрываются. Это занимает некоторое время. Вместо использования / bin / echo или других вы можете написать свою собственную программу «WriteFile», язык более высокого уровня, такой как C / C ++. Что нужно для перенаправления ввода-вывода.

  1. Открыть файловый дескриптор
  2. Запись данных
  3. Закрыть дескриптор файла
  4. Оптимизируйте свой код
  5. Готово

    Проверьте системные вызовы, такие как ssize_t write (int fd, const void * buf, size_t count);

    http://linux.die.net/man/2/write