如何在Python中处理大量内存?

时间:2012-01-30 21:29:24

标签: python

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

  1. 延迟初始化:无论如何,在内存数据中需要许多操作的意义上,这似乎并没有帮助。
  2. 搁置:这个Python标准库似乎支持将数据对象写入数据文件(由某个db支持)。我的理解是它将数据转储到文件中,但是如果你需要它,你仍然需要将它们全部加载到内存中,所以它并没有完全帮助。如果这是一个误解,请纠正我。
  3. 第三个选项是利用数据库,并卸载尽可能多的数据处理
  4. 作为一个例子:科学实验运行了几天,产生了巨大的(tera字节数据)序列:

      

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

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

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

    修改

    我很欣赏所有建议的观点和方向。其中,我发现user488551的评论最为相关。就像我喜欢Map / Reduce,对于许多科学应用程序而言,代码并行化的设置和工作甚至比我原来的问题,恕我直言更难解决。由于我的问题本身是如此公开,所以很难找到答案......但比尔的答案更接近于我们在现实世界中可以做的事情,因此也就是选择。谢谢大家。

2 个答案:

答案 0 :(得分:3)

您是否考虑过分而治之?也许你的问题适合于此。您可以使用的一个框架是Map / Reduce。

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

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

如果Map-Reduce适用于您,请查看Hadoop框架。

答案 1 :(得分:1)

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

如果您的数据在很长一段时间内都在流中,并且您所做的只是创建直方图,则无需将其全部保留。只需创建你的直方图,如果你想让它在以后可用,就把原始数据写到文件中,让Python在你的直方图计数器碰撞后立即收集数据。所有你必须保持居住的是直方图本身,它应该相对较小。