当内存不足时,Jupyter Lab会冻结计算机-如何防止它发生?


12

我最近开始使用Jupyter Lab,但我的问题是我要处理非常大的数据集(通常,数据集本身大约是计算机RAM的1/4)。经过几次转换后,另存为新的Python对象,我倾向于耗尽内存。问题是,当我接近可用的RAM限制并执行需要另一个RAM空间的任何操作时,计算机将冻结,而修复它的唯一方法是重新启动它。这是Jupyter Lab / Notebook中的默认行为,还是我应该设置的某些设置?通常,我希望程序崩溃,而不是整个计算机崩溃(例如在RStudio中)


我以前也遇到过同样的问题,真的很讨厌。我快速浏览了jupyter问题,却一无所获。如果通过IPython(不是普通的python)控制台运行,是否也会发生?
Bzazz19年

您使用了什么包装/模块?它是什么操作系统?你有交换吗?什么版本的Jupyter Lab?如果是Linux,内核版本是什么?
尼扎姆·穆罕默德

它主要是熊猫,但我不认为它与包装有关。操作系统为Ubuntu 16.04.6 LTS,内核版本为4.15.0-65-generic。Jupyter Lab版本是1.0.2。我将SWAP设置为12 GB(分配给2个文件),这是我的RAM的1.5。
杰克斯

Answers:


5

绝对最可靠的解决方案是使用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内存选项的语法,请参阅以下问题:

docker运行“ --memory”选项需要哪个单元?


4

如果您使用的是Ubuntu,请查看OOM杀手,您可以从此处获取信息

您可以使用Earlyoom。可以根据需要配置它,例如,earlyoom -s 90 -m 15启动,earlyoom并且当交换大小小于%90并且内存小于%15时,它将终止导致OOM的进程并防止整个系统冻结。您还可以配置进程的优先级。


2

我还在Jupyter Lab上处理非常大的数据集(3GB),并且在Labs上也遇到了同样的问题。目前尚不清楚是否需要维护对预转换数据的访问,如果不需要,如果不需要,我已经开始使用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补全或更新jedi。

在10117中,他们建议检查的输出get_ipython().history_manager.db_log_output。我有相同的问题,我的设置正确,但是值得检查


1

您还可以在云中使用笔记本,例如此处的 Google Colab 。他们为推荐的RAM提供了便利,默认情况下,对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

我建议不要再添加列表(可能RAM会再次过载)。您应该在该for循环中完成工作。


我认为这里的问题不是如何不耗尽内存,而是如何避免计算机崩溃并需要重新启动。Python应该崩溃或引发内存错误,但不要弄乱一切。
Bzazz19年

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

没有理由查看大型数据帧的整个输出。查看或处理大型数据框将不必要地使用大量计算机资源。

无论您做什么,都可以微型完成。当数据帧较小时,对数据进行编码和处理要容易得多。处理大数据的最佳方法是创建一个仅占大数据帧一小部分或一小部分样本的新数据帧。然后,您可以浏览数据并在较小的数据帧上进行编码。浏览数据并使代码正常工作后,只需在较大的数据框中使用该代码即可。

最简单的方法是使用head()函数简单地从数据帧中获取前n行,即前几行。头函数仅打印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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.