Jupyter Lab заморожує комп'ютер, коли немає оперативної пам'яті - як це запобігти?


12

Нещодавно я почав використовувати лабораторію Jupyter, і моя проблема полягає в тому, що я працюю з досить великими наборами даних (зазвичай сам набір даних становить приблизно 1/4 моєї комп'ютерної оперативної пам’яті). Після кількох перетворень, збережених як нові об’єкти Python, у мене, як правило, не вистачає пам'яті. Проблема полягає в тому, що коли я наближаюся до доступного обмеження оперативної пам’яті і виконую будь-яку операцію, яка потребує іншого простору оперативної пам’яті, мій комп'ютер застигає, і єдиний спосіб виправити це - перезапустити його. Це поведінка за замовчуванням у лабораторії Юпітера / ноутбука чи це я повинен встановити деякі параметри? Як правило, я б очікував, що програма вийде з ладу (як, наприклад, в RStudio), а не весь комп'ютер


У мене були ті ж проблеми і раніше, це справді неприємно. Я швидко ознайомився з питаннями про юпітер і нічого не знайшов. Чи трапляється це також, якщо ви переходите через консоль IPython (не звичайний пітон)?
Бзазз

Який пакет / модуль ви використовували? Що це за ОС? У вас був своп? Яка версія лабораторії Юпітера? Якщо це був Linux, то яка версія ядра?
Нізам Мохамед

В основному це панди, але я не думаю, що це пов'язано з пакетом. ОС - Ubuntu 16.04.6 LTS, а версія ядра - загальна для 4.15.0-65. Версія лабораторії Юпітера 1.0.2. У мене SWAP встановлений на 12 ГБ (призначений для 2 файлів), що становить 1,5 моєї оперативної пам’яті.
Джейки

Відповіді:


5

Абсолютно найбільш надійним рішенням цієї проблеми було б використання контейнерів Docker. Ви можете вказати, скільки пам’яті потрібно виділити Юпітеру, і якщо у контейнера не вистачає пам’яті, це просто не велика справа (просто пам’ятайте, що потрібно часто економити, але це само собою зрозуміло).

Цей блог отримає вас більшу частину шляху. Тут також є кілька гідних інструкцій щодо встановлення лабораторії Юпітера з одного із вільно доступних, офіційно підтримуваних зображень Юпітера тут:

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

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

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

Для синтаксису параметрів пам'яті докера див. Це питання:

Яку одиницю очікує набір докера опція "- пам'ять"?


4

Якщо ви використовуєте Ubuntu, перевірте Oom вбивця, ви можете отримати інформацію тут

Можна скористатися раннім зумом . Він може бути налаштований за вашим бажанням, наприклад earlyoom -s 90 -m 15, запустить earlyoomі коли розмір swap менше% 90, а пам'ять менше% 15, це знищить процес, що викликає OOM, і завадить замерзнути всій системі. Ви також можете налаштувати пріоритет процесів.


2

Я також працюю з дуже великими наборами даних (3 Гб) в лабораторії Юпітера, і у мене виникли ті ж проблеми в лабораторіях. Незрозуміло, чи потрібно вам підтримувати доступ до попередньо трансформованих даних, якщо ні, я почав використовувати delневикористані великі змінні кадри даних, якщо вони мені не потрібні. delвидаляє змінні зі своєї пам'яті. Редагувати **: існує кілька можливостей для проблеми, з якою я стикаюся. Я зустрічаюсь з цим частіше, коли я використовую віддалений екземпляр юпітера, а також у шпидері, коли я провожу великі перетворення.

напр

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

Jakes ви також можете вважати цю тему на великих робочих процесах даних корисною. Я шукав Dask, щоб допомогти зберігати пам'ять.

Я помітив у шпидері та юпітері, що заморожування зазвичай відбувається під час роботи в іншій консолі, поки працює велика консоль пам'яті. Щодо того, чому він просто замерзає, а не вибивається, я думаю, що це має щось спільне з ядром. У github на IPython відкрито кілька проблем із пам'яттю - # 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)

-4

Немає підстав переглядати весь вихід великого фрейму даних. Перегляд або маніпулювання великими кадрами даних зайво використовуватиме велику кількість ваших комп'ютерних ресурсів.

Все, що ви робите, можна зробити мініатюрним. Набагато простіше працювати над кодуванням та маніпулюванням даними, коли кадр даних невеликий. Найкращий спосіб роботи з великими даними - це створити новий кадр даних, який займає лише невелику частину або невелику вибірку великого кадру даних. Потім ви можете вивчити дані та зробити кодування на меншому кадрі даних. Після того, як ви вивчили дані та налагодите роботу коду, просто використовуйте цей код на більшому кадрі даних.

Найпростіше - просто взяти перший n, номер перших рядків з кадру даних за допомогою функції head (). Функція головки друкує лише n, кількість рядків. Можна створити міні-кадр даних, використовуючи головну функцію на великому кадрі даних. Нижче я обрав перші 50 рядків і передав їх значення малому файлу. Це передбачає, що 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.