Я использую gawk для просмотра большого текстового корпуса (около 3-4 ГБ, сборник электронных книг), чтобы распечатать каждую ассоциацию из 3 слов, которые встречаются не менее 3 раз, для получения лингвистической статистики. Вот код:
содержимое файла .awk:
BEGIN { RS="[^[:alnum:]]+" }
{ w1 = w2; w2 = w3; w3 = $0 }
NR > 2 { count[tolower(w1 " " w2 " " w3)]++ }
END {
for (phrase in count) {
if (count[phrase] >= 3) {
print phrase, count[phrase]
}
}
}
команда: gawk -f file.awk mytxtfile > вывод
Он отлично работает с небольшими файлами (несколько сотен МБ), но я не могу заставить его работать с файлами размером более 1 ГБ: gawk съедает всю мою оперативную память (8 ГБ) менее чем за минуту, затем начинает есть мой своп и всю систему. в итоге замерзает.
Знаете ли вы, как я мог бы оптимизировать код, даже если в конечном итоге это заняло бы гораздо больше времени?
Большое тебе спасибо
awk '{print all 3 wrd sets}' | sort | uniq -c | awk '$1>2{print}'
или подобное. Удачи. - person shellter   schedule 26.06.2012awk
; но, возможно, переход к, например. Python не был бы непреодолимым усложнением. - person tripleee   schedule 26.06.2012mawk
? Я считаю, что единственное изменение, которое потребуется вашему коду, этоRS="[^a-zA-Z0-9]+"
. Скорее всего, это сработает только в том случае, если вы чуть превысили лимит памяти, но это, по крайней мере, очень легко проверить. (Кроме того, я очень сомневаюсь, чтоsort
будет работать, учитывая этот размер.) - person Adam Katz   schedule 18.09.2018