Как к динамично выбрал очередь PBS во время представления задания

Это не ответ, но не может опубликовать его как комментарий.

Другой (очень быстрый) способ сделать это было предложено Mikeserv здесь :

{ head -n 19 >/dev/null; head -n 26; } 

, используя тот же тестовый файл AS здесь и та же процедура, вот Некоторые ориентиры (извлечение линий 1000020-1000045):

Mikeserv :

{ head -n 1000019 >/dev/null; head -n 26; } 

Stefan :

head iplist -n 1000045 | tail -n 26

real    0m0.054s

Это намного самые быстрые решения, а различия незначительны (для одного прохода) (Я пытался с разными диапазонами: пару строк, миллионы линий и т. Д.).

Делать его без трубы, возможно, предложить значительное преимущество, однако, к заявке, необходимую для поиска множественных диапазонов линий аналогичной моды, как:

for  pass in 0 1 2 3 4 5 6 7 8 9
do   printf "pass#$pass:\t"
     head -n99 >&3; head -n1
done <<1000LINES 3>/dev/null
$(seq 1000)
1000LINES

... какая печатается ..

pass#0: 100
pass#1: 200
pass#2: 300
pass#3: 400
pass#4: 500
pass#5: 600
pass#6: 700
pass#7: 800
pass#8: 900
pass#9: 1000

... и только читает файл через один раз.


Другое SED / / / / Perl Perl Решения Прочитайте весь файл и поскольку это о огромных файлах, они не очень эффективны. Я бросил некоторые альтернативы, что выход или q UIT после последней строки в указанном диапазоне:

Stefan :

awk "1000020 <= NR && NR <= 1000045" iplist

real    0m2.448s

VS.

awk "NR >= 1000020;NR==1000045{exit}" iplist

real    0m0.243s

Дкагегел ( SED ):

sed -n 1000020,1000045p iplist

real    0m0.947s

VS.

sed '1,1000019d;1000045q' iplist

real    0m0.143s

Стивен Д :

perl -ne 'print if 1000020..1000045' iplist

real    0m2.041s

против.

perl -ne 'print if $. >= 1000020; exit if $. >= 1000045;' iplist

real    0m0.369s

0
15.07.2014, 17:56
1 ответ

Я сомневаюсь, что вы найдете такие инструменты, как то, что вы описываете, звучит как сломанная настройка PBS.

Очереди должны различаться по предполагаемому использованию/пользователям. Если обе очереди обслуживают одних и тех же пользователей с одними и теми же требованиями, то они должны быть объединены специально для того, чтобы исключить проблемы, подобные той, которую вы подняли. Весь смысл пакетных планировщиков заключается в жонглировании ресурсами между пользователями/заданиями. Если пользователю приходится вручную добавлять ввод в уравнение, то, на мой взгляд, что-то в этом процессе нарушается.
Не очень хорошее решение, но вы можете просто написать скрипт самостоятельно, чтобы получить очередь, что-то вроде:

#!/bin/bash
case $# in
  2) ;;
  *) echo "Usage: $(basename $0) 'WALLTIME' 'JOBNAME'"
  echo "WALLTIME should be in format HH:MM:SS"
  echo "JOBNAME should be filename of PBS script (full path if not in local directory)"
  exit 0
  ;;
esac

MYWALL="$1"
MYJOB="$2"
cnt=0
i=0
qstat -q|
while read q
do
   if (( cnt < 2 ))
   then
      ((cnt++))
      continue
   else
      ((i++))
      WALL[$i]=$(echo $q|awk '{print $4}')
      Q[$i]=$(echo $q|awk '{print $7}')
      NAME[$i]=$(echo $q|awk '{print $1}')
   fi
done
MINQ=${Q[1]}
for ((q=1; q <= i; q++)) 
do
   if [[ "${MYWALL}" > "${WALL[$q]}" ]]
   then
      continue
   else
      if [[ ${Q[$q]} -le $MINQ ]]
      then
         MINQ=${Q[$q]}
         NAMEQ="${NAME[$q]}"
      fi
   fi
done

if [[ ! "$NAMEQ" ]]
then
   echo "WALLTIME $MYWALL greater than walltime of any queue"
fi
echo "qsub -q $NAMEQ $MYJOB"
qsub -q "$NAMEQ" "$MYJOB"
0
28.01.2020, 04:59

Теги

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