Python 由于内存不足导致计算机崩溃

Python crashes computer due to low memory

如果这是一个重复的问题,请提前原谅 - 我搜索了 Whosebug,但没有找到以这种方式提出的问题。

我的电脑是 运行 Python 2.7,自从我开始处理一个 800 万行的数据集以来;我收到一条错误消息,提示我的计算机内存不足。我在上传数据集时收到此消息 _ 我什至没有开始处理它。

它实际上使我的整个计算机崩溃了好几次。因为这是我的工作电脑,所以我要求 IT 人员清理我的虚拟内存,尽可能增加内存,甚至清理我的硬盘。但正如预期的那样,我仍然遇到了这个问题。在个人设置中,我在 AWS 上使用 python jupyter notebook 来解​​决这个问题——但我在工作中没有这个选项。

你会推荐什么? pyspark 是最好的方法吗?我是 spark 的新手,有没有类似 jupyter notebook for spark 的东西?

非常感谢

tl;dr:要么分块读取,要么尝试 mmap

这主要与 python 无关,因为您似乎试图将比实际 RAM 多的数据加载到主内存中。您的操作系统将尝试通过将多余的 and/or 不需要的数据放到您的硬盘 disk/ssd 上来进行补偿 [这太慢了——单个 CPU Skylake 系统可以达到超过 30GB/s,速度很快NVMe SSD 可能是 2GB/s,而你的普通 HDD 在 0.1GB/s 范围内]。 Windows 调用此虚拟内存,在 Linux 上它是交换,在 Mac 上我不知道。

通常的解决方案是分块处理数据。

假设您有一个包含数百万行的 huuuge 文本文件,那么您可以一次处理一行。一些 perlish 伪代码:

$FH = open ("myhugefile");
while ($line = getLine ($FH)) {
     process ($line);
}
close $FH;

您尝试做的似乎更像这样:

$FH = open ("myhugefile");
$array = new Array ();
while ($line = getLine ($FH)) {
    push ($array, $line);
}
close $FH;   
foreach ($line in $array) {
    process ($line);
}

由于$array是存储在内存中的,所以第二种方法在处理庞大的数据集时会有一些问题。

当然,如果您的 process()-函数也可能会产生大量数据。因此可能有必要将其写入 HDD/SSD 而不是将其存储在内存中。

在编译器构造讲座中,我参加了另一个学生使用 mmap 将文件读入他的解析器。事实证明,与其他人对第一个任务所做的相比,这 非常 快(但是,其他人确实赶上了后来的任务,因为他的实际处理速度因 bad/naive 实施而变慢).

无论如何,mmap背后的基本思想是让您的操作系统将您的文件映射到您的内存中。然后它将为您动态加载内容,同时您可以像访问普通内存对象一样访问它。

通用解释可以在维基百科上找到:https://en.wikipedia.org/wiki/Mmap

Python2 带有示例的文档:https://docs.python.org/2/library/mmap.html (看起来很简单)