Awk getline занимает все больше времени

MattK спросил: 13 октября 2017 в 07:44 в: awk

Иметь (G | M) awk-скрипт, который используется для перераспределения строк из исходных файлов в разные файлы в зависимости от содержимого. Примером является разделение набора исходных данных на отдельные датированные файлы на основе метки времени строки.

Это достаточно быстро, пока мне не нужно добавить строку заголовка csv. Исходные данные поступают в неупорядоченном виде, поэтому я решил использовать if (getline < (fname) < 0) { print cols > fname } для создания каждого файла назначения с строкой заголовка при первом касании.

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

Этот процесс также запускается в GNU Parallel, поэтому тест system -f не работает, зависая при системном вызове.

Предложения о том, как обратиться к производительности при создании файлов с заголовком? Нужно сохранить этот скрипт в Awk, поскольку уже есть другая логика.


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

date, time, measure
2017-01-01, 00:00, 10
2017-01-01, 01:00, 20
2017-01-03, 00:05, 30
2017-01-02, 02:10, 40
2017-01-03, 00:00, 50

Результатом этого сценария будет 3 файла на основе столбца даты:

Имя файла: 20170101.log

date, time, measure
2017-01-01, 00:00, 10
2017-01-01, 01:00, 20

Имя файла: 20170102.log

date, time, measure
2017-01-02, 02:10, 40

Имя файла: 20170103.log

date, time, measure
2017-01-03, 00:05, 30
2017-01-03, 00:00, 50

Запуск этого рекомбинация журналов происходит быстро и просто до тех пор, пока не понадобится включить заголовок столбца. Кажется, что по мере роста файлов назначения операция getline занимает больше времени на каждый вызов. Другие примеры показали использование system вызовов test -f для существования файла, но это тоже дорогостоящая операция и, кажется, зависает в GNU Parallel.

0 ответов