LINUX.ORG.RU

xargs бы посоветовал, опция -P, но передача строки будет не в stdin или из файла, а как параметр.

bl ★★★
()
Ответ на: комментарий от zagruzkaaa

Количество процессоров можно узнать у неё:

nproc

anonymous
()
Ответ на: комментарий от bl

Прошу прощение за наглость, но вот у меня например есть мой bash скрипт

cat file.txt | while read var1 do echo var1>>log.txt done

Как мне это распаралелить?

zagruzkaaa
() автор топика
Ответ на: комментарий от anonymous

было бы замечательно, но для начала хотя бы без порядка

zagruzkaaa
() автор топика
Ответ на: комментарий от zagruzkaaa

cat file.txt | xargs -L1 -P2 bash script.sh >> log.txt

каждая строчка которая будет в file.txt будет передана как аргумент.
-L1 кол-во строк на аргумент.

bl ★★★
()
Ответ на: комментарий от zagruzkaaa
#!/bin/bash

n=0
k=$(nproc)
seq 20 |
while read i; do
  n=$(($n+1))
  k=$(($k-1))
  ./test.sh >$n &
  if [ "$k" == "-1" ]; then
    wait -n 1
    k=$(($k+1))
  fi
done
wait

seq 20 | while read i; do
  n=$(($n+1))
  cat $n
  rm -f $n >/dev/null
done >result.txt
anonymous
()
Ответ на: комментарий от zagruzkaaa

Анонимус опередил. Суть в том, что command & отдает пид команды которая запускается в фоне. wait умеет ждать по заданному пиду. Т.е. необходимые фишки есть, дальше как в любом нормальном языке с многопоточностью.

Про parallel кури man parallel. Да и примеров в гугле полно. Максимум простой пример, который построчно запускается в parallel:

$ echo -e "sleep 1 && echo '1';\nsleep 3 && echo '3';\nsleep 2 && echo '2';"  | parallel 
1
2
3

entefeed ☆☆☆
()
Ответ на: комментарий от anonymous
  • ./test.sh - полезная нагрузка
  • >$n - перенаправление процесса №n в файл №n.
  • wait -n 1 - подождать завершения одного дочернего процесса
anonymous
()
Ответ на: комментарий от anonymous

& - запустить дочерний процесс

anonymous
()
Ответ на: комментарий от anonymous

т.е все что считывается записывается в какие-то переменные и по завершению всего считывания склеивается и направляется в результирующий файл? а если у меня будут очень большие объемы файла, то все они будут хранится в оперативной памяти?

anonymous
()
Ответ на: комментарий от anonymous

а если у меня будут очень большие объемы файла, то все они будут хранится в оперативной памяти?

нет, будут храниться в отдельных временных файлах. а уже они будут удаляться по мере перехода их данных в результирующий файл. Конечный размер дискового пространства для данной операции: сумма всех данных + размер результата самой большой (по данным) операции.

anonymous
()
Ответ на: комментарий от anonymous

просто wait, да, завершения всех дочерних процессов

anonymous
()
Ответ на: комментарий от anonymous

могу и 100 поставить) но как определяется это максимальное значение которое я могу определить?

anonymous
()
Ответ на: комментарий от anonymous

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

Хрена тут у вас, анонимус на анонимусе.

entefeed ☆☆☆
()

тебе нужно — что:

1. чтобы ресурсы процессора не проиставали бы?

или

2. чтобы побыстрее работа выполнялась бы?

---

в случае {1} — ну придумай как загрузить процессор.. cat /dev/zero >/dev/null & cat /dev/zero >/dev/null & cat /dev/zero >/dev/null & и всё такое :) .. дело не хитрое!

в случае {2} — лучще используй вместо bash — нормальный язык программирования.

тем более считывать строку из файла и что-то-с-ней-делать — это явно не уровень Баша. тут нужен более тонкий хирургический инструмент.

погляди например на python и его модуль multiprocessing

user_id_68054 ★★★★★
()
Последнее исправление: user_id_68054 (всего исправлений: 1)
Ответ на: комментарий от user_id_68054

Ну а как именно на баше сделать с наивысшей скоростью? как программно узнать оптимальное количество параллельно запущенных программ

zagruzkaaa
() автор топика
Ответ на: комментарий от zagruzkaaa

ага, тогда прости что влез, ответ тот же, тесты.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.