Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Bash многопоточная очередь  (Прочитано 2321 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн peregrine

  • Автор темы
  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7211
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Bash многопоточная очередь
« : 14 Мая 2013, 23:22:18 »
Доброго времени суток. Имеются каталоги (их довольно много). В них хранятся файлы формата wav, а так же могут быть и другие файлы. Необходимо преобразовать wav в mp4 с aac потоком внутри. Для перекодировки используется neroAacEnc. К сожалению, программа работает только в один поток, и ресурсы компьютера расходуются не рационально. Я использовал скрипт на bash следующего содержания:
(Нажмите, чтобы показать/скрыть)
На этом форуме находил скрипт на странице https://forum.ubuntu.ru/index.php?topic=214337.0 (благодарен автору), запускающий несколько процессов одновременно. Попытался переделать его под свои нужды:
(Нажмите, чтобы показать/скрыть)
В результате теряю некоторые файлы на выходе или использую только один процесс перекодировки. В гугле искал, но ничего полезного не смог найти.
Подскажите, пожалуйста, в какую сторону копать. Может быть есть менее костыльные способы (например, xargs, но я не понял, как при его помощи добиться желаемого результата, если это возможно). Faac прошу не предлагать, мне кажется, что он портит звук. Заранее благодарен за возможные ответы.

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Re: Bash многопоточная очередь
« Ответ #1 : 14 Мая 2013, 23:34:07 »
где вывод ошибка?
=============
Цитировать
for i in ./wav16/*.wav
если файл имена пробел проблема?
Wars ~.o

Оффлайн peregrine

  • Автор темы
  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7211
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Bash многопоточная очередь
« Ответ #2 : 14 Мая 2013, 23:47:16 »
Пробелов в именах файлов нет, ошибок не выдаёт, просто не прорабатывает файлы до конца (может обработать 16 из 20 файлов и успешно завершиться, а если ждать кажлый раз завершения (комментировал в коде во втором скрипте, где это делать необходимо
Цитировать
wait;# если я ставлю wait, то всё нормально, но работает только один поток, если не ставлю, то теряю файлы на выходе
, то работает только один процесс, правда, тогда всё нормально отрабатывает, но медленно, так как нагружается только одно ядро а другие простаивают), если не ждать завершения каждого запущенного процесса. Может быть есть какие-то средства для запуска двух и более (в зависимости от количества ядер) процессов сразу.

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Re: Bash многопоточная очередь
« Ответ #3 : 15 Мая 2013, 00:06:10 »
neroAacEnc -2pass -br 128000 -if "$InputFileName" -of "$OutputFileName"  &не знаю, можно ffmpeg.
Wars ~.o

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Bash многопоточная очередь
« Ответ #4 : 15 Мая 2013, 07:40:13 »
где вывод ошибка?
=============
Цитировать
for i in ./wav16/*.wav
если файл имена пробел проблема?

получится 1 поток

neroAacEnc -2pass -br 128000 -if "$InputFileName" -of "$OutputFileName"  &не знаю, можно ffmpeg.
получится fork-bomb (ну или её безобидный вариант, так, fork-петарда), приятного будет мало

peregrine,
Тебе надо поделить список файлов на N частей и отдать эти списки N процессам neroAacEnc
где N - это число ядер на твоей машине

С наскоку я не подскажу как это прямо однострочником круто сделать, а вот если допустить некий минимальный ручной труд то
1) список файлов
find ./dir -type f -iname '*.wav' >fulllist.txt
2) делишь список в любом редакторе на N частей сохраняешь файлы с именами list_1.txt list_2,txt

3) запускаешь конвертилки
for f in file_{1,2,3,N}.txt; do
    (cat $f | while read InputFileName; do
        neroAacEnc -2pass -br 128000 -if $InputFileName -of $(echo $InputFileName | sed -e 's/.wav/.mp4/g') 
    done; echo "$f done") &
done

можно заморочиться и сделать разбивку списка на части автоматом. но это если надо такие файлы постоянно конвертить

P.S. корректность не проверял. мог накосячить но алгоритм понятен

Оффлайн peregrine

  • Автор темы
  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7211
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Bash многопоточная очередь
« Ответ #5 : 15 Мая 2013, 18:45:02 »
Всем, кто откликнулся, большое спасибо, особенно, Yurror. Проблема решена. Если кому понадбится:
(Нажмите, чтобы показать/скрыть)
« Последнее редактирование: 17 Июня 2013, 20:00:48 от peregrine »

 

Страница сгенерирована за 0.122 секунд. Запросов: 25.