Выделить больше памяти и ресурсов процессора для программы

Несерьезный ответ, но такие проблемы иногда заставляют желать SQL -в оболочке -или, возможно, наоборот, что-то вроде:

 find. -type f |
 awk -F/ -vOFS=/ -vq=\' 'BEGIN{print "create table temp (dir varchar, f varchar);"}
      {f=$(NF--); print "insert into temp values(" q $0 q "," q f q ");" }
      END{print "select dir from temp group by dir ";
           print "having sum(when f like "q"%.c"q" then 1 else 0 end)>0 ";
           print "and sum(when f="q"Makefile"q" then 1 else 0 end)=1;"}
      ' | dosql
1
09.08.2019, 22:41
3 ответа

Программы потребляют всю память и мощность ЦП, которые они могут получить, если они не имеют встроенных -ограничений. unzipне имеет таких встроенных -ограничений. Вы можете дать ему меньше, но вы не можете дать ему больше, потому что по умолчанию ему разрешено брать столько, сколько он хочет.

Распаковка не требует -интенсивного использования памяти. Основные затраты памяти на распаковку огромного архива заключаются в том, что unzip сохраняет список файлов в памяти.

Ограничивающим фактором для скорости может быть мощность процессора или диска (или сеть, если вы читаете или записываете файл в сеть ). Это зависит от того, насколько быстро ваш диск относительно вашего процессора. Проверьте, использует ли процесс 100% одного ядра. Если это не так, то единственный способ ускорить это - ускорить ввод/вывод. Это может означать более быстрый диск или размещение ввода и вывода на отдельных дисках.

Если процесс занимает 100% одного ядра, то можно ускорить его за счет распараллеливания. Для многих форматов сжатия декомпрессия одного файла по своей природе -не может быть распараллелена, поскольку формат является очень адаптивным :сжатие достигается путем поиска повторяющихся шаблонов и замены их некоторой косвенной ссылкой на предыдущий шаблон.Некоторые форматы сжатия имеют «точки повторной инициализации», которые позволяют распаковывать каждый блок независимо; Я знаю, что это как минимум относится к bzip2. Некоторые инструменты сжатия делают это, даже если формат этого не требует. Но, насколько я знаю, это не относится к zip. С другой стороны, zip сжимает каждый член архива отдельно, поэтому можно распаковывать каждый файл независимо. Таким образом, если у вас n ядер, вы можете занять их все распаковкой отдельных файлов (, если ваш ввод-вывод работает на должной скорости ).

Проблема заключается в том, чтобы найти параллельную реализацию распаковки. Я думаю, что p7zip поддерживает его с 7z x -mmt=on foo.zipили7z x -mmt=8(для использования 8 ядер ), но документация p7zip не очень хороша, и я не подтвердил, что это действительно распараллеливается.

2
27.01.2020, 23:22

(так как я не могу добавить комментарий к другому ответу)
htop— один из инструментов для просмотра информации о процессе. Если в столбце «S» (для состояния )отображается «D», это означает, что процесс заблокирован, обычно ожидая завершения операций ввода-вывода. Увеличьте пропускную способность сети или хранилища (, например RAID или более быстрые жесткие диски/твердотельные накопители/NVMe ), чтобы устранить это узкое место.

iotop— еще один полезный инструмент для обнаружения таких узких мест; это покажет вам 100% использование ввода-вывода для этого процесса.

1
27.01.2020, 23:22

Вы можете использовать pigz, который выполняет параллельное сжатие/распаковку с использованием всех ядер ЦП, декомпрессия unpigz в какой-то момент была последовательной, но я думаю, что она была улучшена. Это действительно супер круто

https://linux.die.net/man/1/pigz

1
04.09.2020, 14:49

Теги

Похожие вопросы