С опцией многопоточности -T0
вы сообщаете xz две вещи одновременно. Использование MT также означает:ожидание , пока все входные (данные )не будут считаны в память, а затем начать сжатие «параллельно».
После включения pigz
в мои тесты я анализирую производительность шаг за шагом; У меня есть файл 100M f100
.
$ time xz -c f100 >/dev/null
real 0m2.658s
user 0m2.573s
sys 0m0.083s
99% времени тратится на сжатие одного ядра. Со всеми четырьмя ядрами, активированными с помощью-T4
(или -T0
)
$ time xz -c -T4 f100 >/dev/null
real 0m0.825s
user 0m2.714s
sys 0m0.284s
Общий результат :На 300 % быстрее, почти линейно для каждого ядра. Значение «пользователь» должно быть разделено на 4 в соответствии с тем, как оно сообщается/определяется. «sys» теперь показывает некоторые накладные расходы --real — это сумма 1/4 user плюс sys.
$ time gzip -dc f100.gz >/dev/null
$ time pigz -p4 -dc f100.gz >/dev/null
Это 0,5 против 0,2 секунды; когда я соберу все вместе:
$ time pigz -dc -p4 f100.gz | xz -c -T4 >out.xz
real 0m0.902s
user 0m3.237s
sys 0m0.363s
...уменьшает 0,8 + 0,2 = 0,9.
С несколькими файлами , но не слишком много, вы можете получить максимальный общий параллелизм с 4 фоновыми процессами оболочки. Вместо этого я использую четыре файла размером 25M :
.for f in f25-?.gz; do time pigz -p4 -dc "$f" | xz -c -T0 >"$f".xz & done
Это кажется даже немного быстрее с 0,7 с. И даже без многопоточности, даже дляxz
:
for f in f25-?.gz; do time gzip -dc "$f" | xz -c >"$f".xz & done
Просто настроив четыре простых четвертных конвейера с &
, вы получите 0,8 с, как и для 100-мегабайтного файла с xz -T4
.
В моем сценарии активировать многопоточность в xz
так же важно, как и распараллелить весь конвейер; если вы можете комбинировать это с pigz и/или несколькими файлами,вы даже можете быть немного быстрее, чем четверть суммы отдельных шагов.
Согласноhttps://stackoverflow.com/a/7109208/1745001допустимыми символами в URL являются:
A-Z, a-z, 0-9, -,., _, ~, :, /, ?, #, [, ], @, !, $, &, ', (, ), *, +,,, ;, %, and =
так что, если мы предположим, что это правда, вы могли бы попробовать:
grep -o -E "https?://[][[:alnum:]._~:/?#@!$&'()*+,;%-]+" file
Это все еще может быть не на 100% точным, поскольку некоторые из этих символов могут существовать только в определенных контекстах, но это, вероятно, лучшее, что вы можете сделать с помощью простого grep/regexp.
Если ваш grep поддерживает это, для дополнительного ограничения добавьте границу слова (, например. \<
в GNU grep )перед http
.
Прочитайте man grep
и сделайте что-то вроде
grep -o -E 'https?://[^"]+' the_file