Я застрял на этом.Так что в моем коде есть такой цикл while-read, который занимает так много времени, и я хотел бы запустить его во многих процессорах.Но я хотел бы разделить входной файл и запустить 14 циклов (потому что у меня 14 потоков), по одному для каждого разделенного файла, параллельно.Дело в том, что я не знаю, как сказать циклу while, какой файл получить и с чем работать.
Например, в обычном цикле while-read я бы написал:
while read line
do
<some code>
done < input file or variable...
Но в этом случае я хотел бы разбить указанный выше входной файл на 14 файлов и запустить 14 циклов while параллельно, по одному для каждого разделенного файла.Я пытался:
split -n 14 input_file
find . -name "xa*" | \
parallel -j 14 | \
while read line
do
<lot of stuff>
done
также пытался
split -n 14 input_file
function loop {
while read line
do
<lot of stuff>
done
}
export -f loop
parallel -j 14 ::: loop
Но я также не мог сказать, какой файл будет входом для цикла, так что параллель поймет, "возьмите каждый из этих xa *файлы и поместить в отдельные циклы параллельно "
Пример входного файла (список строк)
AEYS01000010.10484.12283
CVJT01000011.50.2173
KF625180.1.1799
KT949922.1.1791
LOBZ01000025.54942.57580
РЕДАКТИРОВАТЬ
Thisэто код.В результате получается таблица (741100 строк) с некоторой статистикой, касающейся уже сделанных выравниваний последовательностей ДНК.Цикл принимает файл input_file (без ломаных линий, изменяется от 500 до ~ 45000 строк, 800Kb) с последовательностями последовательности ДНК, читает его построчно и ищет каждую соответствующую полную таксономию для этих последовательностей в банке данных (~ 45000 строк),Затем он делает несколько сумм / делений.Выходные данные являются .tsv и выглядят так (пример для последовательности "KF625180.1.1799"):
Rate of taxonomies for this sequence in %: KF625180.1.1799 D_6__Bacillus_atrophaeus
Taxonomy %aligned number_ocurrences_in_the_alignment num_ocurrences_in_databank %alingment/databank
D_6__Bacillus_atrophaeus 50% 1 20 5%
D_6__Bacillus_amyloliquefaciens 50% 1 154 0.649351%
$ head input file
AEYS01000010.10484.12283
CVJT01000011.50.217
KF625180.1.1799
KT949922.1.1791
LOBZ01000025.54942.57580
Два дополнительных файла также используются внутри цикла.Они не являются входом для петли.1) файл с именем alnout_file, который служит только для определения количества попаданий (или выравниваний) данной последовательности в банк данных.Это было также ранее сделано вне этой петли.Это может варьироваться в количестве строк от сотен до тысяч.Здесь важны только столбцы 1 и 2.Column1 - это имя последовательности, а col2 - это имя всех последовательностей, с которыми оно совпало в databnk.Это выглядит так:
$ head alnout_file
KF625180.1.1799 KF625180.1.1799 100.0 431 0 0 1 431 1 431 -1 0
KF625180.1.1799 KP143082.1.1457 99.3 431 1 2 1 431 1 429 -1 0
KP143082.1.1457 KF625180.1.1799 99.3 431 1 2 1 429 1 431 -1 0
2) файл .tsv банка данных, содержащий ~ 45000 таксономий, соответствующих последовательностям ДНК.Каждая таксономия находится в одной строке:
$ head taxonomy.file.tsv
KP143082.1.1457 D_0__Bacteria;D_1__Firmicutes;D_2__Bacilli;D_3__Bacillales;D_4__Bacillaceae;D_5__Bacillus;D_6__Bacillus_amyloliquefaciens
KF625180.1.1799 D_0__Bacteria;D_1__Firmicutes;D_2__Bacilli;D_3__Bacillales;D_4__Bacillaceae;D_5__Bacillus;D_6__Bacillus_atrophaeus
Итак, задана последовательность KF625180.1.1799.Ранее я выровнял его по банку данных, содержащему ~ 45000 других последовательностей ДНК, и получил вывод, который имеет все присоединения к последовательностям, которые он соответствовал.Цикл состоит в том, что он находит таксономии для всех этих последовательностей и вычисляет «статистику», о которой я упоминал ранее.Код делает это для всех доступных мне последовательностей ДНК-последовательностей.
TAXONOMY=path/taxonomy.file.tsv
while read line
do
#find hits
hits=$(grep $line alnout_file | cut -f 2)
completename=$(grep $line $TAXONOMY | sed 's/D_0.*D_4/D_4/g')
printf "\nRate of taxonomies for this sequence in %%:\t$completename\n"
printf "Taxonomy\t%aligned\tnumber_ocurrences_in_the_alignment\tnum_ocurrences_in_databank\t%alingment/databank\n"
#find hits and calculate the frequence (%) of the taxonomy in the alignment output
# ex.: Bacillus_subtilis 33
freqHits=$(grep "${hits[@]}" $TAXONOMY | \
cut -f 2 | \
awk '{a[$0]++} END {for (i in a) {print i, "\t", a[i]/NR*100, "\t", a[i]}}' | \
sed -e 's/D_0.*D_5/D_5/g' -e 's#\s\t\s#\t#g' | \
sort -k2 -hr)
# print frequence of each taxonomy in the databank
freqBank=$(while read line; do grep -c "$line" $TAXONOMY; done < <(echo "$freqHits" | cut -f 1))
#print cols with taxonomy and calculations
paste <(printf %s "$freqHits") <(printf %s "$freqBank") | awk '{print $1,"\t",$2"%","\t",$3,"\t",$4,"\t",$3/$4*100"%"}'
done < input_file
Это много greps и парсинга, так что требуется около 12 часов работы в одном процессоре для выполнения всех 45000 последовательностей ДНК.вступления.Я хотел бы разделить input_file и сделать это на всех процессорах, которые у меня есть (14), потому что это будет время, потраченное на это.Спасибо всем за то, что вы так терпеливы со мной =)