如何在Python中处理大内存占用?
我有一个科学应用程序,它从磁盘读取一个潜在的巨大数据文件,并将其转换为各种Python数据结构,如地图地图、列表等。如何在Python中处理大内存占用?,python,Python,我有一个科学应用程序,它从磁盘读取一个潜在的巨大数据文件,并将其转换为各种Python数据结构,如地图地图、列表等。NumPy用于数值分析。问题是,内存使用量可能会快速增长。当交换空间被调用时,系统速度会显著减慢。我看到的总体战略是: 延迟初始化:这似乎没有帮助,因为许多操作无论如何都需要内存中的数据 搁置:这个Python标准库似乎支持将数据对象写入数据文件(由一些db支持)。我的理解是,它会将数据转储到一个文件中,但如果您需要它,您仍然必须将所有数据加载到内存中,因此这并没有什么帮助。如果这
NumPy
用于数值分析。问题是,内存使用量可能会快速增长。当交换空间被调用时,系统速度会显著减慢。我看到的总体战略是:
我感谢所有建议的要点和方向。其中,我发现user488551的评论最为相关。尽管我非常喜欢Map/Reduce,但对于许多科学应用程序来说,代码并行化的设置和工作比我最初的问题IMHO更需要解决。很难找到答案,因为我的问题本身是如此开放。。。但比尔的答案更接近于我们在现实世界中所能做的,因此我们做出了选择。谢谢大家。你们考虑过分而治之吗?也许是你的问题导致了这一点。可以使用的一个框架是Map/Reduce 您的问题是否有多个阶段,例如第一阶段需要一些数据作为输入,并生成可以馈送到第二阶段的输出?在这种情况下,您可以让一个进程执行第一阶段并为第二阶段生成数据。也许这会减少内存中同时需要的数据量 你能把你的问题分成许多小问题并重新组合解决方案吗?在这种情况下,您可以生成多个进程,每个进程处理一个小的子问题,并有一个或多个进程最终合并这些结果
如果Map Reduce对您有效,请查看Hadoop框架。好吧,如果您需要RAM中的整个数据集,除了获得更多RAM之外,没有什么可做的。听起来您不确定是否真的需要,但保持所有数据驻留只需要最少的思考:)
如果您的数据在很长一段时间内以流的形式出现,并且您所做的只是创建一个柱状图,那么您不需要将其全部驻留。只需在执行过程中创建柱状图,将原始数据写入一个文件(如果您希望以后可以使用该文件),并让Python在碰撞柱状图计数器后立即对数据进行垃圾收集。你所需要做的就是保留直方图本身,它应该相对较小。你有没有用分析器检查过直方图上的内容?可能与您的想法完全不同,比如在某个循环中进行不必要的分配。您的工作负载不应该超出范围。对于任何给定的计算量,有多少数据是必需的,没有办法在理论上加以限制吗?“许多操作无论如何都需要内存中的数据”?在这个问题上你必须非常非常精确。为了减少内存占用,您必须将问题分成更小的部分,这些部分可以运行得更慢,但占用的内存更少。这里有一个警告,即2D(或3D)直方图不一定都那么小,尤其是在数据相对稀疏的情况下。我遇到过比原始数据点大得多的情况。最后一条评论超时。。。如果你的直方图太大,你仍然有一个清晰的方法来分离数据/处理(每个时间段都有2D直方图),但我建议使用pytables(www.pytables.org)来存储生成的直方图。这为您提供了缓存的、可追加的磁盘存储,看起来像一个数据阵列,但只在读取时加载数据。我经常在图像流中使用它;您肯定希望将表示与数据的预期特征相匹配。