如何在Python中处理大内存占用?

如何在Python中处理大内存占用?,python,Python,我有一个科学应用程序,它从磁盘读取一个潜在的巨大数据文件,并将其转换为各种Python数据结构,如地图地图、列表等。NumPy用于数值分析。问题是,内存使用量可能会快速增长。当交换空间被调用时,系统速度会显著减慢。我看到的总体战略是: 延迟初始化:这似乎没有帮助,因为许多操作无论如何都需要内存中的数据 搁置:这个Python标准库似乎支持将数据对象写入数据文件(由一些db支持)。我的理解是,它会将数据转储到一个文件中,但如果您需要它,您仍然必须将所有数据加载到内存中,因此这并没有什么帮助。如果这

我有一个科学应用程序,它从磁盘读取一个潜在的巨大数据文件,并将其转换为各种Python数据结构,如地图地图、列表等。
NumPy
用于数值分析。问题是,内存使用量可能会快速增长。当交换空间被调用时,系统速度会显著减慢。我看到的总体战略是:


  • 延迟初始化:这似乎没有帮助,因为许多操作无论如何都需要内存中的数据
  • 搁置:这个Python标准库似乎支持将数据对象写入数据文件(由一些db支持)。我的理解是,它会将数据转储到一个文件中,但如果您需要它,您仍然必须将所有数据加载到内存中,因此这并没有什么帮助。如果这是一个误会,请纠正我
  • 第三种选择是利用数据库,并向其卸载尽可能多的数据处理
  • 例如:一项科学实验运行了几天,产生了大量(万亿字节的数据)序列:

    在时间t观察到的事件E的坐标(x,y)

    我们需要为每个(x,y)计算t上的直方图,并输出一个三维数组

    还有其他建议吗?我想我的理想情况是,内存中的数据结构可以基于软内存限制分阶段到磁盘,并且这个过程应该尽可能透明。这些缓存框架中的任何一个都有帮助吗

    编辑:


    我感谢所有建议的要点和方向。其中,我发现user488551的评论最为相关。尽管我非常喜欢Map/Reduce,但对于许多科学应用程序来说,代码并行化的设置和工作比我最初的问题IMHO更需要解决。很难找到答案,因为我的问题本身是如此开放。。。但比尔的答案更接近于我们在现实世界中所能做的,因此我们做出了选择。谢谢大家。

    你们考虑过分而治之吗?也许是你的问题导致了这一点。可以使用的一个框架是Map/Reduce

    您的问题是否有多个阶段,例如第一阶段需要一些数据作为输入,并生成可以馈送到第二阶段的输出?在这种情况下,您可以让一个进程执行第一阶段并为第二阶段生成数据。也许这会减少内存中同时需要的数据量

    你能把你的问题分成许多小问题并重新组合解决方案吗?在这种情况下,您可以生成多个进程,每个进程处理一个小的子问题,并有一个或多个进程最终合并这些结果


    如果Map Reduce对您有效,请查看Hadoop框架。

    好吧,如果您需要RAM中的整个数据集,除了获得更多RAM之外,没有什么可做的。听起来您不确定是否真的需要,但保持所有数据驻留只需要最少的思考:)


    如果您的数据在很长一段时间内以流的形式出现,并且您所做的只是创建一个柱状图,那么您不需要将其全部驻留。只需在执行过程中创建柱状图,将原始数据写入一个文件(如果您希望以后可以使用该文件),并让Python在碰撞柱状图计数器后立即对数据进行垃圾收集。你所需要做的就是保留直方图本身,它应该相对较小。

    你有没有用分析器检查过直方图上的内容?可能与您的想法完全不同,比如在某个循环中进行不必要的分配。您的工作负载不应该超出范围。对于任何给定的计算量,有多少数据是必需的,没有办法在理论上加以限制吗?“许多操作无论如何都需要内存中的数据”?在这个问题上你必须非常非常精确。为了减少内存占用,您必须将问题分成更小的部分,这些部分可以运行得更慢,但占用的内存更少。这里有一个警告,即2D(或3D)直方图不一定都那么小,尤其是在数据相对稀疏的情况下。我遇到过比原始数据点大得多的情况。最后一条评论超时。。。如果你的直方图太大,你仍然有一个清晰的方法来分离数据/处理(每个时间段都有2D直方图),但我建议使用pytables(www.pytables.org)来存储生成的直方图。这为您提供了缓存的、可追加的磁盘存储,看起来像一个数据阵列,但只在读取时加载数据。我经常在图像流中使用它;您肯定希望将表示与数据的预期特征相匹配。