Jupyter Lab зависает на компьютере, когда не хватает оперативной памяти - как это предотвратить?

12

Я недавно начал использовать Jupyter Lab, и моя проблема в том, что я работаю с довольно большими наборами данных (обычно сам набор данных составляет приблизительно 1/4 от моей компьютерной памяти). После нескольких преобразований, сохраненных в виде новых объектов Python, у меня заканчивается память. Проблема в том, что когда я приближаюсь к доступному пределу ОЗУ и выполняю любую операцию, для которой требуется другое пространство ОЗУ, мой компьютер зависает, и единственный способ исправить это - перезапустить его. Это поведение по умолчанию в Jupyter Lab / Notebook или это некоторые настройки, которые я должен установить? Обычно я ожидаю сбоя программы (как, например, в RStudio), а не всего компьютера.

Джейкс
источник
У меня была такая же проблема раньше, это действительно противно. Я быстро взглянул на проблемы с Jupyter и ничего не нашел. Это также происходит, если вы запускаете через консоль IPython (не просто python)?
Bzazz
Какой пакет / модуль вы использовали? Что это за ОС? У вас был своп? Какая версия Jupyter Lab? Если это был Linux, то какая версия ядра?
Низам Мохамед
В основном это Панды, но я не думаю, что это связано с посылками. Операционная система - Ubuntu 16.04.6 LTS, а версия ядра - 4.15.0-65-generic. Jupyter Lab версия 1.0.2. У меня SWAP установлен на 12 ГБ (назначено на 2 файла), что составляет 1,5 от моей оперативной памяти.
Джейкс

Ответы:

5

Абсолютно самым надежным решением этой проблемы было бы использование контейнеров Docker. Вы можете указать, сколько памяти выделить Jupyter, и если у контейнера заканчивается память, это не имеет большого значения (просто не забывайте часто экономить, но это само собой разумеется).

Этот блог поможет вам в этом. Здесь также есть несколько полезных инструкций по настройке Jupyter Lab из одного из свободно доступных, официально поддерживаемых изображений Jupyter:

https://medium.com/fundbox-engineering/overview-d3759e83969c

и затем вы можете изменить docker runкоманду, как описано в руководстве, как (например, для 3 ГБ):

docker run --memory 3g <other docker run args from tutorial here>

Синтаксис параметров памяти докера см. В следующем вопросе:

Какой блок ожидает опция запуска «--memory»?

kd88
источник
4

Если вы используете Ubuntu, проверьте OOM killers, вы можете получить информацию от здесь

Вы можете использовать earlyoom . Его можно настроить по earlyoom -s 90 -m 15своему усмотрению, например , запускать earlyoomи когда размер подкачки меньше, чем% 90, а память меньше, чем% 15, это убьет процесс, который вызывает OOM, и предотвратит зависание всей системы. Вы также можете настроить приоритет процессов.

emremrah
источник
2

Я также работаю с очень большими наборами данных (3 ГБ) в Jupyter Lab и испытываю ту же проблему в лабораториях. Неясно, нужно ли вам поддерживать доступ к предварительно преобразованным данным, если нет, я начал использовать delнеиспользуемые большие переменные данных, если они мне не нужны. delудаляет переменные из вашей памяти Изменить **: есть несколько возможностей для проблемы, с которой я сталкиваюсь. Я сталкиваюсь с этим чаще, когда использую удаленный экземпляр jupyter, а также в spyder, когда выполняю большие преобразования.

например

df = pd.read('some_giant_dataframe') # or whatever your import is
new_df = my_transform(df)
del df # if unneeded.

Джейкс, вы также можете найти эту тему о больших рабочих процессах данных полезной. Я искал в Dask, чтобы помочь с памятью.

В spyder и jupyter я заметил, что зависание обычно происходит при работе в другой консоли, когда работает консоль большой памяти. Что касается того, почему он просто зависает, а не падает, я думаю, это как-то связано с ядром. В IPython github открыто несколько проблем с памятью - # 10082 и # 10117 кажутся наиболее актуальными. Один пользователь здесь предлагает отключить завершение вкладки jediили обновить джедай.

В 10117 году они предлагают проверить выход get_ipython().history_manager.db_log_output. У меня те же проблемы, и мои настройки правильные, но это стоит проверить

Элизабет
источник
1

Вы также можете использовать ноутбуки в облаке, например, Google Colab здесь . Они предоставили возможность для рекомендованных ОЗУ и поддерживают ноутбук Jupyter по умолчанию.

Джишан Шейх
источник
0

Я думаю, что вы должны использовать куски. Как это:

df_chunk = pd.read_csv(r'../input/data.csv', chunksize=1000000)
chunk_list = []  # append each chunk df here 

# Each chunk is in df format
for chunk in df_chunk:  
    # perform data filtering 
    chunk_filter = chunk_preprocessing(chunk)

    # Once the data filtering is done, append the chunk to list
    chunk_list.append(chunk_filter)

# concat the list into dataframe 
df_concat = pd.concat(chunk_list)

Для получения дополнительной информации проверьте это: https://towardsdatascience.com/why-and-how-to-use-pandas-with-large-data-9594dda2ea4c

Я предлагаю не добавлять список снова (возможно, ОЗУ снова будет перегружено). Вы должны закончить свою работу в этом для цикла.

Беркай
источник
Я думаю, что проблема здесь не в том, как не исчерпать память, а в том, как избежать сбоя компьютера и необходимости перезагрузки. Python должен дать сбой или вызвать ошибку памяти, но не все испортить.
Bzazz
0

Я собираюсь обобщить ответы на следующий вопрос . Вы можете ограничить использование памяти вашей программой. В следующем это будет функция ram_intense_foo(). Перед вызовом нужно вызвать функциюlimit_memory(10)

import resource
import platform
import sys
import numpy as np 

def memory_limit(percent_of_free):
    soft, hard = resource.getrlimit(resource.RLIMIT_AS)
    resource.setrlimit(resource.RLIMIT_AS, (get_memory() * 1024 * percent_of_free / 100, hard))

def get_memory():
    with open('/proc/meminfo', 'r') as mem:
        free_memory = 0
        for i in mem:
            sline = i.split()
            if str(sline[0]) == 'MemAvailable:':
                free_memory = int(sline[1])
                break
    return free_memory

def ram_intense_foo(a,b):
    A = np.random.rand(a,b)
    return A.T@A

if __name__ == '__main__':
    memory_limit(95)
    try:
        temp = ram_intense_foo(4000,10000)
        print(temp.shape)
    except MemoryError:
        sys.stderr.write('\n\nERROR: Memory Exception\n')
        sys.exit(1)
v.tralala
источник
-4

Нет причин просматривать весь вывод большого информационного кадра. Просмотр или манипулирование большими фреймами данных будет излишне использовать большие объемы ресурсов вашего компьютера.

Все, что вы делаете, можно сделать в миниатюре. Работать над кодированием и манипулированием данными намного проще, когда фрейм данных мал. Лучший способ работы с большими данными - это создать новый фрейм данных, который занимает только небольшую часть или небольшую выборку большого фрейма данных. Затем вы можете исследовать данные и выполнить кодирование на меньшем фрейме данных. После того, как вы изучите данные и получите свой код работающим, просто используйте этот код в большом фрейме данных.

Самый простой способ - просто взять первые n, число первых строк во фрейме данных, используя функцию head (). Функция head печатает только n, количество строк. Вы можете создать мини-фрейм данных, используя функцию head для большого фрейма данных. Ниже я выбрал первые 50 строк и передал их значение в small_df. Предполагается, что BigData - это файл данных, полученный из библиотеки, которую вы открыли для этого проекта.

library(namedPackage) 

df <- data.frame(BigData)                #  Assign big data to df
small_df <- head(df, 50)         #  Assign the first 50 rows to small_df

Это будет работать большую часть времени, но иногда большой кадр данных поставляется с предварительно отсортированными переменными или с уже сгруппированными переменными. Если большие данные похожи на эти, вам нужно будет выбрать случайную выборку строк из больших данных. Затем используйте следующий код:

df <- data.frame(BigData)

set.seed(1016)                                          # set your own seed

df_small <- df[sample(nrow(df),replace=F,size=.03*nrow(df)),]     # samples 3% rows
df_small                                                         # much smaller df
Серый
источник