Python - бесконечное l oop при пакетном чтении очень большого текстового файла - PullRequest
0 голосов
/ 28 апреля 2020

Хорошо, у меня есть большой (8 ГБ +) текстовый файл, содержащий устаревшие данные, скорее всего, из мейнфрейма b / c это все фиксированные поля, которые должны анализироваться построчно и символ за символом. Строковое чтение файла прекрасно работает на небольшом образце, но не превышает нескольких сотен МБ.

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

Это то, что я написал в Python, но по какой-то причине приведенный ниже код заканчивается бесконечным l oop при тестировании на файле меньшего размера. Я немного сбит с толку, что перерыв на самом деле никогда не срабатывает и снимок постоянно перезаписывается. Есть идеи, как это исправить?

# Python 3.x 
def convert_txt_to_csv(path_to_txt, path_to_save_csv, column_names):
    df = pd.DataFrame(columns=column_names)

    chunksize = 5000 # 5000000 - 5 million batches for the big file

    print("Add rows...")
    with open(path_to_txt, 'r', encoding="ISO-8859-1") as file:

        lines = True
        cnt = 0
        mil = 1

        while lines:

            lines = file.readlines(chunksize) # This guy should become False if there no more lines...
            if not lines:
                break # Double safety, if they're no more lines, escape the loop... 

            for line in lines:
                process_line(line.replace('\n', ''), df, cnt)
                cnt += 1

         # save snapshot after each batch 
         df.to_csv(path_to_snapshot_csv)
         print("Saved Snapshot: ", mil)
         mil +=1


    print("Process")
    df = process(df)
    print("Safe")
    df.to_csv(path_to_save_csv)
    print("Nr. of data: ", len(df.index))


1 Ответ

0 голосов
/ 28 апреля 2020

РЕШЕНИЕ:

Вышеприведенный код на самом деле работает, но на самом деле ошибка заключалась в том, что строка снимка была неправильно предназначена и вызывалась после каждой строки, а не после каждого пакета, создавая впечатление, что l oop будет застрять, воссоздавая снимок навсегда. Вот несколько оптимизаций, которые я применил за это время:

1) Для файлов разумного размера в пакетном режиме:

для строки в файле: # Не использовать readline ...

        process_line(line) 

2) Для ускорения чтения файлов:

Создайте виртуальный диск и скопируйте туда входной файл.

3) Для пакетной обработки параметр chunk в readline является неким странным байтовым размером, поэтому, например, 1500000 преобразуется в 2995 строк, считываемых подряд.

Благодаря виртуальному диску и пакетной обработке обработка на самом деле довольно быстрая. Спасибо за все ценные материалы и вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...