Минимальная “Очередь Задачи” с инструментами Linux запаса для усиления Многоядерного ЦП

понял это Facepalm

df.loc[a, 'PSAR'] = df.loc[a-1, 'PSAR'] + (df.loc[a-1, 'AF']*(df.loc[a-1, 'EP']-df.loc[a-1, 'PSAR'])) 

Должно быть df.loc[a, 'PSAR'] = df.loc[a-1, 'PSAR'] + (df.loc[a-1, 'AF']*(df.loc[a-1, 'PSAR']-df.loc[a-1, 'EP']))

последние две переменные транспонированы! какая боль ...

Теперь я могу очистить функцию и сделать ее лучше.

надеюсь, что это поможет кому-то еще сделать что-то тупое и застрять на 2 дня

7
задан Manuel 6 May 2009 в 23:14
поделиться

7 ответов

Можете ли вы преобразовать свой список команд в Makefile? Если это так, вы можете просто запустить «make -j X».

14
ответ дан 6 December 2019 в 07:52
поделиться

Подобное удовольствие от распределенных вычислений - это Mapreduce Bash Script:

http://blog.last.fm/2009/04/06/mapreduce-bash-script

И спасибо, что указали на ppss!

0
ответ дан 6 December 2019 в 07:52
поделиться

You can use the xargs command, its --max-procs does what you want. For instance Charlie Martin solution becomes with xargs:

tr '\012' '\000' <mycommands.sh |xargs --null --max-procs=$X bash -c

details:

  • X is the number of processes max. E.g: X=15. --max-procs is doing the magic
  • the first tr is here to terminate lines by null bytes for xargs --null option so that quotes redirection etc are not expansed wrongly
  • bash -c runs the command

I tested it with this mycommands.sh file for instance:

date
date "+%Y-%m-%d" >"The Date".txt
wc -c <'The Date'.txt >'The Count'.txt
0
ответ дан 6 December 2019 в 07:52
поделиться

Хорошо, разместив здесь вопрос, я нашел следующий проект, который выглядит многообещающим: ppss .

Редактировать: Не совсем то, что я хочу, PPSS сосредоточен на обработка "всех файлов в каталоге A".

0
ответ дан 6 December 2019 в 07:52
поделиться

Ну, в любом случае, это довольно забавный вопрос.

Вот что я бы сделал, если предположить, конечно, bash (1) .

  • выяснить сколько из этих команд можно успешно запускать одновременно. Это будет не просто количество ядер; многие команды будут приостановлены из-за ввода-вывода и тому подобного. Например, позвоните по этому номеру N. N = 15
  • устанавливает обработчик сигнала прерывания для сигнала SIGCHLD, который возникает при завершении дочернего процесса. trap signalHandler SIGCHLD
  • пересылает ваш список команд в конвейер
  • записывает цикл, который читает стандартный ввод и выполняет команды одну за другой, уменьшая счетчик. Когда счетчик равен 0, он ждет с.
  • ваш обработчик сигнала, который работает на SIGCHLD, увеличивает этот счетчик.

Итак, теперь, он выполняет первые N команд, а затем ждет. Когда первый дочерний элемент завершается, ожидание возвращается, он читает другую строку, запускает новую команду и снова ждет.

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

 N=15
 COUNT=N
 cat mycommands.sh | 
 while read cmd 
 do
   eval $cmd &
   if $((count-- == 0))
   then
       wait
   fi
 od

Теперь эта команда запускает первые 15 команд, а затем запускает остальные по одной, когда некоторая команда завершается.

0
ответ дан 6 December 2019 в 07:52
поделиться

Это особый случай, но если вы пытаетесь обработать набор файлов и создать другой набор выходных файлов, вы можете запустить #cores количество процессов и проверить, есть ли выходной файл существует до его обработки. В приведенном ниже примере каталог с файлами .m4b преобразуется в файлы .mp3:

Просто запустите эту команду столько раз, сколько у вас есть ядер:

ls * m4b | while read f; выполнить тест -f $ {f% m4b} mp3 || mencoder -of rawaudio "$ f" -oac mp3lame -ovc copy -o $ {f% m4b} mp3; готово &

0
ответ дан 6 December 2019 в 07:52
поделиться

GNU Parallel http://www.gnu.org/software/parallel/ - это более общий инструмент для распараллеливания, чем PPSS.

Если файл запуска содержит:

command 1 > Logs/1.log
command 2 > Logs/2.log
command 3 > Logs/3.log

, вы можете выполнить:

cat runfile | parallel -j+0

, который будет запускать одну команду для каждого ядра ЦП.

Если ваши команды так же просты, как указано выше, вам даже не нужен исполняемый файл, но вы можете:

seq 1 3 | parallel -j+0 'command {} > Logs/{}.log'

Если у вас есть больше компьютеров, доступных для обработки, вы можете посмотреть параметры --sshlogin и --trc для GNU Parallel.

9
ответ дан 6 December 2019 в 07:52
поделиться
Другие вопросы по тегам:

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