Python - поиск предметов в сотнях больших сжатых файлов - PullRequest
4 голосов
/ 27 мая 2011

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

Каждый файл .gz содержит один документ в виде простого текста, около 56 МБ разархивирован и около 210 МБ разархивирован.

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

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

1 Ответ

1 голос
/ 27 мая 2011

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

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

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

...