如果这是一个重复的问题,请提前原谅 - 我搜索了stackoverflow但是没有发现这个问题。
我在计算机上运行Python 2.7,因为我开始使用800万行数据集;我收到一条错误消息,指出我的计算机内存不足。我上传数据集时收到此消息_我甚至没有开始处理它。
它实际上几次撞毁了我的整台电脑。由于这是我的工作电脑,我要求IT清理我的虚拟内存,增加他们的内存,甚至清理我的HD。但正如所料,我仍在努力解决这个问题。在个人环境中,我在AWS上使用python jupyter notebook来克服这个问题 - 但我没有这个选项。
你会推荐什么? pyspark是最好的方式吗?我是新来的火花,是否有类似于jupyter笔记本的火花?
非常感谢
答案 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 (看起来很简单)