Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 12

Тема: MemoryError Python 3 - Почему мой скрипт взрывается от недостатка памяти?

  1. MemoryError Python 3 - Почему мой скрипт взрывается от недостатка памяти?

    Парни, при написании скрипта на Python 3, у меня постоянно вылетает MemoryError.
    Я работаю с большими наборами данных (обрабатываю логи), и мой код просто падает, когда память переполняется.
    Как можно этого избежать? Я уже пробовал оптимизировать код, всякие там garbage collectors и т.д.,
    но все равно получаю эту ошибку. Можете помочь? Желательно с примерами кода.



  2. Ждём вас в нашем чате в Телеграмм ==>> @pythoneer_chat

    А ТАКЖЕ: Канал о Python, статьи и книги ==>>
    @pythoneer_ru

  3. Попробуй использовать генераторы вместо списков. Генераторы не держат все данные в памяти,
    так что тебе будет проще управлять памятью. Вот пример:
    Программный код:
    def process_logs(file_path):
        
    with open(file_path'r') as f:
            for 
    line in f:
                
    # обрабатываем строку
                
    yield line
      
    for log in process_logs('large_log_file.txt'):
        
    # делаем что-то с логом 
    Плюс, если прям совсем много памяти жрет, подумай над использованием
    библиотек типа numpy или pandas, они могут быть эффективнее для больших данных.

  4. Цитата Сообщение от Эмма
    Попробуй использовать генераторы вместо списков. Генераторы не держат все данные в памяти,
    так что тебе будет проще управлять памятью. Вот пример:
    Программный код:
    def process_logs(file_path):
        
    with open(file_path'r') as f:
            for 
    line in f:
                
    # обрабатываем строку
                
    yield line
      
    for log in process_logs('large_log_file.txt'):
        
    # делаем что-то с логом 
    Плюс, если прям совсем много памяти жрет, подумай над использованием
    библиотек типа numpy или pandas, они могут быть эффективнее для больших данных.
    Круто, генераторы часто спасают! Неплохой варик, спасибо за пример.

  5. Если у тебя гигантские файлы и память реально проседает, попробуй использовать модуль mmap.
    Это позволяет мапить файл прямо в память, что очень эффективно. Вот пример:
    Программный код:
    import mmap
      
    def mmap_example
    (file_name):
        
    with open(file_name'r+b') as f:
            
    mm mmap.mmap(f.fileno(), 0)
            for 
    line in iter(mm.readlineb''):
                
    # обработка строки
                
    print(line.decode('utf-8'))
            
    mm.close()

    mmap_example('large_log_file.txt'
    Трюк в том, что mmap использует виртуальную память, а не всю оперативку.

  6. Цитата Сообщение от WarMachine
    Если у тебя гигантские файлы и память реально проседает, попробуй использовать модуль mmap.
    Это позволяет мапить файл прямо в память, что очень эффективно. Вот пример:
    Программный код:
    import mmap
      
    def mmap_example
    (file_name):
        
    with open(file_name'r+b') as f:
            
    mm mmap.mmap(f.fileno(), 0)
            for 
    line in iter(mm.readlineb''):
                
    # обработка строки
                
    print(line.decode('utf-8'))
            
    mm.close()

    mmap_example('large_log_file.txt'
    Трюк в том, что mmap использует виртуальную память, а не всю оперативку.
    mmap это топчик! Сам недавно юзал для большого проекта, реально экономит память.

  7. Ну и классика жанра - разбей данные на куски и обрабатывай их поочередно.
    Можешь попробовать использовать batching. Примерчик кода:
    Программный код:
    def batcher(iterablebatch_size):
        
    batch = []
        for 
    item in iterable:
            
    batch.append(item)
            if 
    len(batch) == batch_size:
                yield 
    batch
                batch 
    = []
        if 
    batch:
            yield 
    batch
      
    with open
    ('large_log_file.txt') as f:
        for 
    batch in batcher(f1000):
            
    # обработка каждого батча
            
    print(batch
    Вроде проще паратной пилы, но реально помогает при больших данных.

  8. Цитата Сообщение от Легкость
    Ну и классика жанра - разбей данные на куски и обрабатывай их поочередно.
    Можешь попробовать использовать batching. Примерчик кода:
    Программный код:
    def batcher(iterablebatch_size):
        
    batch = []
        for 
    item in iterable:
            
    batch.append(item)
            if 
    len(batch) == batch_size:
                yield 
    batch
                batch 
    = []
        if 
    batch:
            yield 
    batch
      
    with open
    ('large_log_file.txt') as f:
        for 
    batch in batcher(f1000):
            
    # обработка каждого батча
            
    print(batch
    Вроде проще паратной пилы, но реально помогает при больших данных.
    Избито, конечно, но эта техника работает просто шикарно. Проверено временем!

  9. Можно еще использовать более продвинутые способы, например Dask.
    Это библиотека для параллельной и распределенной обработки данных.
    Достаточно гибкая вещь для больших данных. Почитай про неё.
    Программный код:
    import dask.dataframe as dd
      
    df 
    dd.read_csv('large_log_file.txt')
    result df.compute()
    print(
    result
    Таким образом, ты можешь обрабатывать огромные файлы с минимальной загрузкой памяти.

  10. Цитата Сообщение от 2222
    Можно еще использовать более продвинутые способы, например Dask.
    Это библиотека для параллельной и распределенной обработки данных.
    Достаточно гибкая вещь для больших данных. Почитай про неё.
    Программный код:
    import dask.dataframe as dd
      
    df 
    dd.read_csv('large_log_file.txt')
    result df.compute()
    print(
    result
    Таким образом, ты можешь обрабатывать огромные файлы с минимальной загрузкой памяти.
    Dask - это уже профессиональный уровень! Не слышал про эту библиотеку, спасибо за наводку.

Страница 1 из 2 12 ПоследняяПоследняя