由于内存不足,Python会崩溃计算机

时间:2017-07-12 14:05:17

标签: python pyspark out-of-memory

如果这是一个重复的问题,请提前原谅 - 我搜索了stackoverflow但是没有发现这个问题。

我在计算机上运行Python 2.7,因为我开始使用800万行数据集;我收到一条错误消息,指出我的计算机内存不足。我上传数据集时收到此消息_我甚至没有开始处理它。

它实际上几次撞毁了我的整台电脑。由于这是我的工作电脑,我要求IT清理我的虚拟内存,增加他们的内存,甚至清理我的HD。但正如所料,我仍在努力解决这个问题。在个人环境中,我在AWS上使用python jupyter notebook来克服这个问题 - 但我没有这个选项。

你会推荐什么? pyspark是最好的方式吗?我是新来的火花,是否有类似于jupyter笔记本的火花?

非常感谢

1 个答案:

答案 0 :(得分:1)

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

这几乎与python无关,因为您似乎尝试将更多数据加载到主内存中,而不是实际拥有RAM。您的操作系统会尝试通过将多余和/或不需要的数据放到您的硬盘/ ssd上来补偿[这很慢就像地狱一样 - 单个CPU Skylake系统可以达到30GB / s以上,快速NVMe SSD可能达到2GB / s,并且你的普通硬盘是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将文件读入他的解析器。与其他人为第一次分配所做的相比,这被证明是非常快(但是,其他人确实赶上了以后的任务,因为他的实际处理因为糟糕/天真的实现而变慢)。

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

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

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