Извлечение URL-адресов из большого файла

С опцией многопоточности -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 и/или несколькими файлами,вы даже можете быть немного быстрее, чем четверть суммы отдельных шагов.

-2
29.08.2020, 18:02
2 ответа

Согласно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.

0
18.03.2021, 23:09

Прочитайте man grepи сделайте что-то вроде

grep -o -E 'https?://[^"]+' the_file
0
18.03.2021, 23:09

Теги

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