@TomRiddle
Новичок - энтузиаст

Как избежать ошибки MemoryError?

Есть программа, которая принимает список xlsx файлов и прогоняет их построчно по очереди, достает нужные сведения и сопоставляет их между собой (ищет совпадения в файлах и так далее..)
Выглядит примерно так:

key_info = {}
for file in tuple_of_files:
    wb = openpyxl.load_workbook(file, read_only=True)
    first_sheet = wb.sheetnames[0]
    for row in wb[first_sheet].rows:
        #тут фрагмент кода чтобы достать из строки нужный объект, который мы сохраняем в переменную var_info
        if var_info not in key_info:
            key_info[var_info] = {'count' : 1, 'reg' : None, 'oper' : None, 'time_use' : set(),  'imeis' : set()}
            #далее фрагмент кода по вычислению и заполнению подсловаря для этого объекта
        if var_info in key_info:
            key_info[var_info]['count'] += 1
            key_info[var_info]['time_use'].add(some_info)
            key_info[var_info]['imeis'].add(some_other_info)

Потом используя словарь с ключевыми значениями key_info создаю xlsx файл и записываю в него результаты анализа.
Программа работает, пока общее число строк в передаваемых ей файлах не превышает примерно 1млн, и в целом делает свою работу. Но когда пытаешься передать файлы с большим объемом (общее число строк около 5млн), то возникает ошибка memoryError.
Я понимаю, что это из-за того, что словарь key_info просто уже не может вмещать информацию, однако разбить его на несколько других файлов или обнулять через определенное число строк, никак не получится - теряется весь функционал проверки..

Как можно избежать этой ошибки? Зависит ли она от мощности используемого ПК?
  • Вопрос задан
  • 50 просмотров
Решения вопроса 1
@noremorse_ru
if var_info in key_info:
заменить на else
Множества set() тебе зачем? Они сами по себе тяжелые, возьми список
Ну и самое главное, зачем ты хранишь все в памяти? Пиши результаты в бд или файл. Или ты можешь отправить их на удаленный сервер асинхронно, который запишет в бд, всё зависит на сколько ты далеко хочешь зайти))
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
deeplay Новосибирск
от 130 000 ₽
от 130 000 ₽
Enjoy PRO Санкт-Петербург
от 140 000 до 180 000 ₽
21 окт. 2020, в 22:53
50000 руб./за проект
21 окт. 2020, в 22:40
300 руб./за проект
21 окт. 2020, в 22:34
25000 руб./за проект