Как я могу запустить этот скрипт bash параллельно?

Мне нужно, чтобы это было более эффективным

В настоящее время это занимает до 20 часов в зависимости от линии (это довольно большие массивы данных MCS).

  • Разделите большой файл данных на свои «снимки»
  • Создает список имен каждого снимка, которые будут использоваться в цикле for
  • Петли через каждый снимок и выполняют те же процессы
  • Добавляет каждый снимок в новый файл данных, так что вы имеете одну и ту же строку aa раньше, но обрабатываете. В этом случае я периодически фильтрую данные, поэтому я думаю, что это можно запустить параллельно.

Вы можете игнорировать все команды SU, а также все в цикле for, мне просто нужно знать, как запускать это параллельно (скажем, 32 узла). Это относительно новая тема для меня, поэтому мы получим глубокое объяснение!

сценарий:

#! /bin/bash # Split the input file into one file for each shot. NB mustclose each o/p file at the earliest opportunity otherwise it will crash! susplit <$1 key=fldr stem=fldr_ verbose=1 close=1 # Create a list of shot files ls fldr* > LIST # Loop over each shot file; suppress direct wave; write to new concatenated output file for i in `cat LIST`; do echo $i suchw key1=tstat key2=tstat a=200 < $i | suwind key=tracf min=10 max=400 tmin=0 tmax=6 | suweight a=0 | suresamp rf=4 | sustatic hdrs=1 sign=-1 | sureduce rv=1.52 | sumedian median=1 xshift=0 tshift=0 nmed=41 | suflip flip=3 | sureduce rv=1.52 | suflip flip=3 | suresamp rf=0.25 | suweight inv=1 a=0 | sustatic hdrs=1 sign=1 >> $2 done # Tidy up files by removing single shot gathers and LIST rm -f fldr* LIST & 

Я предполагаю, что цикл for вы хотите распараллеливать,

 #! /bin/bash # Split the input file into one file for each shot. NB mustclose each o/p file at the earliest opportunity otherwise it will crash! susplit <$1 key=fldr stem=fldr_ verbose=1 close=1 sucit() { i=$1 echo $i suchw key1=tstat key2=tstat a=200 < $i | suwind key=tracf min=10 max=400 tmin=0 tmax=6 | suweight a=0 | suresamp rf=4 | sustatic hdrs=1 sign=-1 | sureduce rv=1.52 | sumedian median=1 xshift=0 tshift=0 nmed=41 | suflip flip=3 | sureduce rv=1.52 | suflip flip=3 | suresamp rf=0.25 | suweight inv=1 a=0 | sustatic hdrs=1 sign=1 } export -f sucit parallel sucit ::: fldr* > $2 # Tidy up files by removing single shot gathers and LIST rm -f fldr* LIST & 

В зависимости от того, что susplit делает, вы можете сделать это еще быстрее. Если выстрел в файле «large_data_file» начинается с <shot>\n и заканчивается </shot>\n то может работать что-то вроде этого:

 sucpipe() { suchw key1=tstat key2=tstat a=200 | suwind key=tracf min=10 max=400 tmin=0 tmax=6 | suweight a=0 | suresamp rf=4 | sustatic hdrs=1 sign=-1 | sureduce rv=1.52 | sumedian median=1 xshift=0 tshift=0 nmed=41 | suflip flip=3 | sureduce rv=1.52 | suflip flip=3 | suresamp rf=0.25 | suweight inv=1 a=0 | sustatic hdrs=1 sign=1 } export -f sucpipe parallel --block -1 --recstart '<shot>\n' --recend '</shot>\n' --pipepart -a $1 sucpipe > $2 

Он попытается разбить bigfile на n блоков, где n = количество ядер. Разделение выполняется «на лету», поэтому сначала не будет записывать временные файлы. Затем GNU Parallel передаст каждый блок в трубку.

Если файл bigfile является двоичным (то есть не текстовым) с заголовком 3200 байт и длиной записи 1000 байтов, тогда это может работать:

 parallel -a bigfile --pipepart --recend '' --block 1000 --header '.{3200}' ... 

Для получения дополнительной информации пройдите через учебник: man parallel_tutorial Ваша командная строка вас полюбит.