BASH: параллельный запуск

Поскольку у вас есть два состояния, что наличие двух разных строк смещения между ними - задача для awk (или perl, или python). Поскольку мой текущий язык - python, программа будет выглядеть так:

import sys

rule_file = sys.argv[1]
new_rules = sys.argv[2]

mode = "save_rules"
for line in open(rule_file):
    line = line.strip()
    if line == "#start":
        print line
        print new_rules
        mode = "replace_rules"
    elif line == "#end":
        mode = "save_rules"
        print line
    elif mode == "save_rules":
        print line

Теперь сохраните это в rule_replace.py и вызовите его с помощью

python rule_replace.py my_rule_file.txt 'FirewallRuleSet global {
FirewallRule allow tcp to google.com
FirewallRule deny tcp to facebook.com
FirewallRule deny tcp to twitter.com
FirewallRule allow tcp to exaple.com



#more rules
}' >new_rules.txt

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

$ python rule_replace.py my_rule_file.txt $new_rules

Обратите внимание, что этот сценарий, хотя он работает, не является решением для чего-то в производстве. Он не обнаруживает никаких ошибок (например, если нет исходного файла). Он предполагает, без проверки, что за строкой #start всегда следует строка #end и что строки точно такие, как вы описали. Он также может использовать некоторое ведение журнала, если будет запущен в производство.

4
06.05.2017, 21:49
2 ответа

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

Перегруппировка задач помогает.

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

2
27.01.2020, 20:53

Начиная с версии 20160422, вы можете:

## Solve in PARALLEL
parallel {1} -m {2} -o {3} --timeout 3600 ::: "${METHODS[@]}" :::+ "${INFILES[@]}" :::+ "${OUTFILES[@]}"

Если у вас более старая версия:

## Solve in PARALLEL
parallel --xapply {1} -m {2} -o {3} --timeout 3600 ::: "${METHODS[@]}" ::: "${INFILES[@]}" ::: "${OUTFILES[@]}"

Потратьте час на изучение man parallel_tutorial . Ваша командная строка полюбит вас за это.

3
27.01.2020, 20:53

Теги

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