2

Я иногда запускаю команду convert *.tif bla.pdf с 60 изображениями. Теперь это делает мой компьютер непригодным для использования до его завершения.

Я попробовал использовать nice и ionice но это не сильно помогло.

Есть ли способ ограничить ресурсы (чтение / запись диска и, возможно, процессор) для команды convert?

2 ответа2

1

На самом деле проблема в том, что все файлы TIFF загружались в ОЗУ одновременно. Проблема не была связана ни с использованием процессора, ни с операциями чтения / записи на диск (ну, sortof). Он заполнял оперативную память (4 Гб), а затем использовал Swap.

Итак, по предложению кого-то я разделил процедуру на два этапа.

  1. find . -iname '*.tif' | xargs -I% convert % %.pdf преобразует каждое изображение отдельно
  2. pdftk *.pdf cat output merged.pdf && rm *.tif.pdf объединяет PDF-файлы и удаляет отдельные PDF-файлы.

В целом это было быстрее, и компьютер не был заблокирован.

0

Попробуйте установить и использовать "cpulimit". Я думаю, что пагубный эффект, который оказывают такие процессы (конвертирование / пакетные операции с изображениями), более вероятен из-за загрузки процессора, чем из-за ввода-вывода, по крайней мере, это мое впечатление. Я не уверен насчет оперативной памяти; Я на самом деле не уверен, что convert будет загружать все в оперативную память одновременно. Например, даже если вы преобразуете PDF с помощью imagemagick, он сначала будет использовать gs и извлекать страницу за страницей, а затем преобразует страницы PGN в / tmp в любую спецификацию и формат, которые вы указали в imagimagick / convert (но с другой стороны, это "наоборот", извлечение изображений из PDF, а не создание PDF, так что я не знаю).

У меня сложилось впечатление, что cpulimit более эффективен для длительных процессов или "эндогенных" пакетных процессов данного процесса (как и любой другой образ imagemagick), но он не работает так же хорошо, как с чем-то, что неоднократно вызывается в цикле bash, для пример (если, возможно, это не скрипт, а cpulimit - проблема ограничения использования CPU этим скриптом). Чтобы уменьшить нагрузку на процессор многократно запущенных процессов, я думаю, что лучший способ - это добавить некоторую произвольную задержку (бездействие) в цикле (это может быть как-то адаптивно, например, модулировать время ожидания с помощью некоторого числа, которое вы получаете из чего-то вроде "top" или возможно, желательно какой-то другой, менее интенсивно использующий процессор (что-то в /proc /stat?), показывающее использование процессора).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .