如果这是一个重复的问题,请提前原谅 - 我搜索了 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/