#python #gzip #large-files #large-data-volumes #corpus
#python #gzip #большие файлы #большие объемы данных #corpus
Вопрос:
К сожалению, я работаю с чрезвычайно большим корпусом, который распределен на сотни файлов .gz — фактически, 24 гигабайта (упакованных). Python действительно мой родной язык (хах), но мне было интересно, не столкнулся ли я с проблемой, которая потребует изучения «более быстрого» языка?
Каждый файл .gz содержит один документ в виде обычного текста, его объем составляет около 56 МБ в архиве и около 210 МБ в распакованном виде.
В каждой строке находится n-грамм (биграмма, триграмма, квадриграмма и т.д.), А справа — количество частот. По сути, мне нужно создать файл, в котором хранятся частоты подстрок для каждой квадриграммы наряду с подсчетом частоты всей строки (т. Е. 4 частоты в униграмме, 3 частоты в биграмме и 2 частоты в триграмме, в общей сложности 10 точек данных). У каждого типа n-gram есть свой собственный каталог (например, все биграммы отображаются в собственном наборе из 33 файлов .gz).
Я знаю простое решение методом перебора и какой модуль импортировать для работы с архивированными файлами на Python, но мне было интересно, есть ли что-нибудь, что не отнимет у меня недели процессорного времени? Мы были бы очень признательны за любые советы по ускорению этого процесса, пусть даже незначительному!
Комментарии:
1. И ваш вопрос в том …?
2. Упс. Вы опубликовали так же, как я его отредактировал. 🙂
3. Как говорит Эндрю, вам действительно нужно задать вопрос здесь, но в целом я бы поспорил, что язык обработки — это не ваша проблема, а скорее скорость доступа к диску будет значительным ограничителем.
4. Вы оценили время, исходя из того, сколько времени требуется для работы с одним файлом, или вы предполагаете?
5. Привет, Кэти — на данный момент я не помню, сколько времени потребовалось, чтобы сделать это с одним файлом, но даже для одного файла, содержащего 4 грамма, это означает поиск по каждому файлу, который содержит 3 грамма, биграммы и униграммы. Я даже не уверен, с какой структурой данных быстрее всего работать.
Ответ №1:
Было бы полезно иметь пример из нескольких строк и ожидаемого результата. Но, насколько я понимаю, вот несколько идей.
Вы, конечно, не хотите обрабатывать все файлы каждый раз, когда обрабатываете один файл или, что еще хуже, один 4-граммовый. В идеале вы должны просмотреть каждый файл один раз. Итак, мое первое предложение — поддерживать промежуточный список частот (эти наборы из 10 точек данных), где сначала учитывается только один файл. Затем, когда вы обработаете второй файл, вы обновите все частоты для элементов, с которыми вы сталкиваетесь (и, предположительно, добавите новые элементы). Затем вы будете продолжать в том же духе, увеличивая частоту по мере того, как найдете больше подходящих n-граммов. В конце запишите все.
Более конкретно, на каждой итерации я бы считывал новый входной файл в память в виде преобразования строки в число, где строка представляет собой, скажем, n-грамму через пробел, а число — ее частоту. Затем я бы обработал промежуточный файл с последней итерации, который содержал бы ожидаемый результат (с неполными значениями), например «a b c d : 10 20 30 40 5 4 3 2 1 1» ( как бы угадываю результат, который вы ищете здесь). Для каждой строки я бы искал на карте все подграммы на моей карте, обновлял количество и записывал обновленную строку в новый выходной файл. Этот файл будет использоваться на следующей итерации, пока я не обработаю все входные файлы.
Комментарии:
1. Спасибо! Вы правы, что я ищу вывод формы: «a b c d : 10 20 30 40 5 4 3 2 1 1»