Python – поиск элементов в сотнях больших, gzip-файлов

К сожалению, я работаю с чрезвычайно большим корпусом, который распространяется на сотни файлов .gz – на самом деле 24 гигабайта (упакован). Python – это действительно мой родной язык (hah), но мне было интересно, не сталкивался ли я с проблемой, которая потребует изучения «более быстрого» языка?

Каждый .gz-файл содержит один документ в обычном тексте, около 56 МБ, gzipped и около 210 МБ.

На каждой строке есть n-грамм (bigram, триграмм, quadrigram и т. Д.), А справа – счетчик частоты. Мне нужно в основном создать файл, в котором хранятся частоты подстроки для каждой квадратиграммы вместе со всем ее количеством строк (т. Е. 4 частоты униграмм, 3 биграм-частоты и 2 частоты триграмм для всего 10 точек данных). Каждый тип n-грамма имеет свой собственный каталог (например, все биграмы отображаются в их собственном наборе из 33 файлов .gz).

Я знаю простое решение для грубой силы, и какой модуль импортировать для работы с gzipped-файлами в Python, но мне было интересно, есть ли что-то, что не займет у меня недель процессорного времени? Любые советы по ускорению этого процесса, как бы незначительно, были бы высоко оценены!

Это поможет иметь пример нескольких строк и ожидаемого результата. Но из того, что я понимаю, вот некоторые идеи.

Вы, конечно же, не хотите обрабатывать все файлы каждый раз, когда обрабатываете один файл или, что еще хуже, один 4-граммовый. В идеале вы могли бы пройти каждый файл один раз. Поэтому мое первое предложение состоит в том, чтобы поддерживать промежуточный список частот (эти наборы из 10 точек данных), где они сначала учитывают только один файл. Затем, когда вы обрабатываете второй файл, вы обновляете все частоты для предметов, с которыми вы сталкиваетесь (и предположительно добавляете новые элементы). Тогда вы будете продолжать так, увеличивая частоты, когда найдете более подходящие n-граммы. В конце напишите все.

Более конкретно, на каждой итерации я читал новый входной файл в память как карту строки для числа, где строка – это, скажем, n-грамм, разделенный пробелом, а число – его частота. Затем я обработал промежуточный файл с последней итерации, которая будет содержать ожидаемый результат (с неполными значениями), например «abcd: 10 20 30 40 5 4 3 2 1 1» (вид угадывания вывода, который вы ищете здесь ). Для каждой строки я просматриваю на карте все подграммы на моей карте, обновляю счет и выписываю обновленную строку в новый выходной файл. Этот будет использоваться в следующей итерации, пока я не обработаю все входные файлы.