[python] RAM이 없을 때 Jupyter Lab이 컴퓨터를 정지시킵니다. 어떻게 방지 할 수 있습니까?

나는 최근 Jupyter Lab을 사용하기 시작했으며 문제는 상당히 큰 데이터 세트로 작업한다는 것입니다 (일반적으로 데이터 세트 자체는 컴퓨터 RAM의 약 1/4입니다). 새로운 파이썬 객체로 저장된 몇 가지 변환 후에 메모리가 부족합니다. 문제는 사용 가능한 RAM 제한에 접근하고 컴퓨터가 정지하는 다른 RAM 공간이 필요한 작업을 수행 할 때이 문제를 해결하는 유일한 방법은 다시 시작하는 것입니다. Jupyter Lab / 노트북의 기본 동작입니까, 아니면 설정해야합니까? 일반적으로 전체 컴퓨터가 아닌 RStudio와 같이 프로그램이 중단 될 것으로 예상합니다.



답변

이 문제에 대한 가장 강력한 해결책은 Docker 컨테이너를 사용하는 것입니다. Jupyter에 할당 할 메모리 양을 지정할 수 있으며, 컨테이너에 메모리가 부족한 경우에는 큰 문제가 아닙니다 (자주 저장하는 것을 기억하십시오).

이 블로그 는 가장 많은 정보를 제공합니다. 또한 무료로 제공되고 공식적으로 유지 관리되는 Jupyter 이미지 중 하나에서 Jupyter Lab을 설정하는 적절한 지침이 있습니다.

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

docker run튜토리얼에서 설명한대로 명령을 수정할 수 있습니다 (예 : 3GB).

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

도커 메모리 옵션에 대한 구문은 다음 질문을 참조하십시오.

docker는 “–memory”옵션을 실행하는 단위는 무엇입니까?


답변

Ubuntu를 사용하는 경우 OOM 킬러를 확인 하십시오. 여기 에서 정보를 얻을 수 있습니다

earlyoom 을 사용할 수 있습니다 . 당신이 원하는대로 예를 들어, 구성 할 수 있습니다 earlyoom -s 90 -m 15시작됩니다 earlyoom및 스왑 크기가 작은 90 % 이상을하고 메모리가 적은 15 % 이상, 그 원인은 OOM하는 프로세스를 종료하고 동결 전체 시스템을 방지 할 수있을 때. 프로세스의 우선 순위를 구성 할 수도 있습니다.


답변

또한 Jupyter Lab에서 매우 큰 데이터 세트 (3GB)로 작업하며 Labs에서도 동일한 문제가 발생했습니다. 사전 변환 된 데이터에 대한 액세스를 유지해야하는지 확실하지 않습니다. 그렇지 않은 경우 필요없는 del미사용 큰 데이터 프레임 변수를 사용 하기 시작 했습니다. del메모리에서 변수를 제거합니다. 편집 ** : 내가 겪고있는 문제에 대한 여러 가능성이 있습니다. 원격 jupyter 인스턴스를 사용할 때와 대규모 변환을 수행 할 때 스파이더 에서도이 문제가 더 자주 발생합니다.

예 :

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

Jakes 대규모 데이터 워크 플로 에서이 스레드가 도움 이 될 수도 있습니다. 메모리 저장을 돕기 위해 Dask 를 살펴 보았습니다 .

스파이더와 jupyter에서 대형 메모리 콘솔이 실행되는 동안 다른 콘솔에서 작업 할 때 일반적으로 정지가 발생한다는 것을 알았습니다. 왜 충돌하지 않고 멈추는 지에 관해서는 이것이 커널과 관련이 있다고 생각합니다. IPython github에 몇 가지 메모리 문제가 있습니다 -# 10082 및 # 10117 이 가장 관련이있는 것 같습니다. 여기에서 한 명의 사용자가 jedijedi 에서 탭 완성 기능을 비활성화 하거나 업데이트 할 것을 제안 합니다.

10117에서 그들은의 출력을 검사 할 것을 제안한다 get_ipython().history_manager.db_log_output. 동일한 문제가 있고 설정이 정확하지만 확인할 가치가 있습니다.


답변

Google Colab과 같은 클라우드에서도 노트북을 사용할 수도 있습니다 . 권장 RAM을위한 기능을 제공했으며 Jupyter 노트북 지원이 기본적으로 제공됩니다.


답변

덩어리를 사용해야한다고 생각합니다. 그렇게 :

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를 확인 하십시오.

목록을 다시 추가하지 않는 것이 좋습니다 (RAM이 다시 과부하 될 것입니다). for 루프에서 작업을 완료해야합니다.


답변

다음 질문에 대한 답변을 요약 하겠습니다 . 프로그램의 메모리 사용량을 제한 할 수 있습니다. 다음은이 기능 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)


답변

큰 데이터 프레임의 전체 출력을 볼 이유가 없습니다. 큰 데이터 프레임을 보거나 조작하면 불필요하게 많은 양의 컴퓨터 리소스가 사용됩니다.

당신이 무엇을하든 미니어처로 할 수 있습니다. 데이터 프레임이 작을 때 데이터 코딩 및 조작 작업이 훨씬 쉽습니다. 빅 데이터를 사용하는 가장 좋은 방법은 큰 데이터 프레임의 일부 또는 작은 샘플 만 가져 오는 새 데이터 프레임을 만드는 것입니다. 그런 다음 작은 데이터 프레임에서 데이터를 탐색하고 코딩을 수행 할 수 있습니다. 데이터를 탐색하고 코드가 작동하게되면 더 큰 데이터 프레임에서 해당 코드를 사용하십시오.

가장 쉬운 방법은 head () 함수를 사용하여 데이터 프레임에서 첫 n 행의 첫 번째 행 수를 가져 오는 것입니다. head 함수는 n 개의 행 수만 인쇄합니다. 큰 데이터 프레임에서 헤드 기능을 사용하여 미니 데이터 프레임을 만들 수 있습니다. 아래에서 처음 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