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

标签 python pyspark out-of-memory

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

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

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

你会推荐什么? pyspark 是最好的选择吗?我是 Spark 新手,有没有类似于 Spark 的 Jupyter Notebook 的东西?

非常感谢

最佳答案

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

这基本上与Python无关,因为你似乎试图将比实际RAM更多的数据加载到主内存中。您的操作系统将尝试通过将多余和/或不需要的数据放入您的硬盘/SSD 来进行补偿 [这速度慢得要命 - 单个 CPU Skylake 系统可以达到超过 30GB/s,快速 NVMe SSD 可能达到 2GB/s,并且你的普通硬盘在 0.1GB/s 范围内]。 Windows 称之为虚拟内存,在 Linux 上称之为交换,在 Mac 上我不知道。

通常的解决方案是以 block 的形式处理数据。

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

$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 将文件读入他的解析器的操作。事实证明,与其他人在第一个任务中所做的相比,这非常快(但是,其他人确实 catch 了后来的任务,因为由于糟糕/幼稚的实现,他的实际处理速度较慢)。

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

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

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

关于Python 由于内存不足而导致计算机崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45059959/

相关文章:

具有小数指数的 Python 指数运算符

pyspark - 当我编写 Pyspark 代码以连接 Snowflake 时出现错误

ios - 使用高分辨率纹理优化 SceneKit 性能

python - 将字符串拆分为字符串

python - Pytest - 功能级别的 fixture 自省(introspection)

python - 缩放(规范化)SPARK Dataframe 中的一列 - Pyspark

python - 更改rdd中的数据类型

java - Linux:Java Web 应用程序内存不足,不响应请求但不抛出 OOM?

c# - TiffBitmapEncoder,内存错误导致 C#/WPF 中内存不足异常

python - 如何在 Python 中分割输入参数