【问题标题】:Python crashes computer due to low memoryPython由于内存不足导致计算机崩溃
【发布时间】:2017-07-12 14:05:17
【问题描述】:

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

我在我的计算机上运行 Python 2.7,因为我开始使用 800 万行数据集;我收到一条错误消息,提示我的计算机内存不足。我在上传数据集的那一刻就收到了这条消息_我什至没有开始处理它。

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

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

非常感谢

【问题讨论】:

  • 您可以开始对数据集进行下采样,选择随机的行子集
  • 或者你可以分块处理你的数据,从每一行中删除不需要的列,等等。在不知道具体细节的情况下,在没有找到新工具的情况下可能会有很多解决这个问题的方法。
  • 不幸的是,我无法对数据进行下采样 - 要求是实际数据 - 800 万行已经是一个块 - 我有多个这样的数据集,我想合并;我正在尝试建立客户旅程,为此我需要所有客户历史记录 - 每笔交易

标签: python pyspark out-of-memory


【解决方案1】:

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

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

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

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

$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 (看起来很简单)

【讨论】:

  • 谢谢 - 这很有帮助;我会全部尝试
  • 不客气。进一步研究:您还可以尝试查看 DBMS 构建。也就是说,如何从一条 SQL 语句生成一个处理管道,它 (a) 非常快并且 (b) 可以处理大量数据。这些家伙有很多不错的技巧(但有些相当复杂,可能有点矫枉过正)。大数据,例如hadoop 和其他 map-reduce 实现也面临着类似的挑战。也许你可以使用类似的东西?
  • 我确实有一个可以使用的 hadoop 基础设施——可能与 Spark 一起使用;但是我想了解python中是否没有方法-我一定会尝试块和mmap方法。我认为最终我需要迁移到 Spark,因为数据集每年都在增长。谢谢你
猜你喜欢
  • 2011-04-29
  • 2013-06-15
  • 1970-01-01
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多