Несовместимые времена выполнения l oop с большой обработкой памяти - PullRequest
0 голосов
/ 11 апреля 2020

У меня есть многочисленные большие CSV-файлы (~ 400 МБ каждый, нужно обработать тысячи из них, по крайней мере, сто на выполнение программы), содержащие длинные строки в первой ячейке каждой строки (около 100-300 символов в строке на 1 миллион строк на файл), и моя Python программа проверяет, есть ли подстрока в данной строке. Если это так, то я добавляю строку, содержащую строку, в список, чтобы сохранить его в другой серии CSV-файлов после обработки всех входных файлов. Для первых дюжин входных файлов программа запускается примерно по 20 секунд на файл, что меня устраивает.

Соответствующая часть кода (строковая обработка l oop) выглядит так:

check = set(['a','b','c'])
storage = []
data = glob.glob('data_address/*.csv')
for raw_file in data:
    read_file = open(raw_file,'r',newline='',encoding='utf-8')  
    list_file = list(csv.reader((line.replace('\0','') for line in read_file), delimiter=","))
    row_count = sum(1 for row in list_file)

    for i in range(1, row_count);
        text = set(list_file[i][0].split())
        if len(check.intersection(text)) > 0:
           storage.append(list_file[i])

Проблема в том, что по мере увеличения числа обрабатываемых входных файлов я начинаю иметь определенные файлы, которые занимают гораздо больше времени, чем 20 секунд. Кроме того, эти аномалии обрабатываются все дольше и дольше - на обработку первой аномалии уходит около 50 секунд, а ближе к концу l oop аномалии могут обрабатываться тысячи секунд, что указывает на то, что проблема связана с l oop сам, а не отдельный файл. Эти аномалии явно не отличаются от других файлов с точки зрения количества совпадений строк.

Что я не понимаю, так это то, что увеличение времени обработки не согласовано. У меня все еще есть много 20-секундных файлов между каждой аномалией, поэтому не может быть, чтобы программа просто замедлялась по мере увеличения объема памяти. Кто-нибудь знает, что происходит? В cProfile не отображается какой-либо компонент, который может вызывать проблему.

Я использую 64-битный Python 3.8 на Windows 10 с жестким диском емкостью 1 ТБ и около 10 000 МБ активной памяти.

1 Ответ

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

У нас пока недостаточно информации для правильной диагностики проблемы, поэтому я подумал, что попытаюсь улучшить код, которым вы поделились:

import csv
import pathlib

check = {'a', 'b', 'c'}

data_path = pathlib.Path("data_address")

saved_rows = []

for curr_path in data_path.glob("*.csv"):
    with open(curr_path, newline='') as curr_file:
        reader = csv.reader((line.replace('\0', '') for line in curr_file), delimiter=",")

        for row in reader:
            row_text = row[0].split()
            if any(elem in check for elem in row_text):
                saved_rows.append(row)

Хотя я не могу проверить это, это должно работать просто отлично.

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