Один из способов сделать это — постепенно наращивать конвейер, синхронизируя каждое добавление и убирая как можно больше из уравнения (например, вывод на терминал или в файл). Очень простой пример показан ниже:
pax:~$ time ( cat bigfile >/dev/null )
real 0m4.364s
user 0m0.004s
sys 0m0.300s
pax:~$ time ( cat bigfile | tr 'a' 'b' >/dev/null )
real 0m0.446s
user 0m0.312s
sys 0m0.428s
pax:~$ time ( cat bigfile | tr 'a' 'b' | tail -1000l >/dev/null )
real 0m0.796s
user 0m0.516s
sys 0m0.688s
pax:~$ time ( cat bigfile | tr 'a' 'b' | tail -1000l | sort -u >/dev/null )
real 0m0.892s
user 0m0.556s
sys 0m0.756s
Если вы суммируете пользовательское и системное время выше, вы увидите, что постепенное увеличение составляет:
- 0,304 (0,004 + 0,300) секунды для
cat
;
- 0,436 (0,312 + 0,428 - 0,304) секунды для
tr
;
- 0,464 (0,516 + 0,688 - 0,436 - 0,304) секунды для
tail
; и
- 0,108 (0,556 + 0,756 - 0,464 - 0,436 - 0,304) секунды для
sort
.
Это говорит мне о том, что главное, на что нужно обратить внимание, это tail
и tr
.
Теперь очевидно, что это только для ЦП, и мне, вероятно, следовало бы выполнить несколько прогонов на каждом этапе для целей усреднения, но это основной первый подход, который я бы выбрал.
Если выяснится, что это действительно ваш grep
, у вас есть еще несколько вариантов. Существует множество других команд, которые могут отделять строки, не начинающиеся с цифры, но вы можете обнаружить, что специально созданная команда для этого может быть еще быстрее, например псевдокод (непроверенный, но вы должны получить идея):
state = echo
lastchar = newline
while not end of file:
read big chunk from file
for every char in chunk:
if lastchar is newline:
if state is echo and char is non-digit:
state = skip
else if state is skip and and char is digit:
state = echo
if state is echo:
output char
lastchar = char
Пользовательский целевой код, подобный этому, иногда можно сделать более эффективным, чем механизм обработки регулярных выражений общего назначения, просто потому, что его можно оптимизировать для конкретного случая. Вы должны проверить, верно ли это в данном случае или в любом случае. Моя главная мантра оптимизации: измеряй, а не гадай!
person
paxdiablo
schedule
10.10.2011
sort -u
должен позаботиться об этом. - person Christoffer Hammarström   schedule 10.10.2011