我有一个科学应用程序,它从磁盘读取一个潜在的巨大数据文件并将其转换为各种 Python 数据结构,例如 map 的 map 、列表的列表等。NumPy
被调用用于数值分析。问题是,内存使用量会快速增长。当调入交换空间时,系统会显着变慢。我见过的大体策略:
- 惰性初始化:从某种意义上说,这似乎无济于事,因为无论如何,许多操作都需要内存数据。
- 搁置:这个 Python 标准库似乎支持将数据对象写入数据文件(由某些数据库支持)。我的理解是它将数据转储到一个文件中,但是如果你需要它,你仍然必须将它们全部加载到内存中,所以它并没有完全帮助。如果这是一个误会,请纠正我。
- 第三种选择是利用数据库,并将尽可能多的数据处理工作分流给它
举个例子:一个科学实验运行了几天,并产生了一个巨大的(万亿字节的数据)序列:
co-ordinate(x,y) observed event E at time t.
我们需要为每个 (x,y) 计算 t 上的直方图并输出一个 3 维数组。
还有其他建议吗?我想我的理想情况是内存中的数据结构可以基于软内存限制分阶段到磁盘,并且这个过程应该尽可能透明。这些缓存框架中的任何一个都有帮助吗?
编辑:
我感谢所有建议的要点和方向。其中,我发现 user488551 的评论最相关。尽管我喜欢 Map/Reduce,但对于许多科学应用程序而言,代码并行化的设置和工作甚至比我最初的问题 IMHO 更需要解决。很难选择一个答案,因为我的问题本身很开放……但比尔的答案更接近我们在现实世界中可以做的事情,因此选择了。谢谢大家。
最佳答案
您是否考虑过分而治之?也许您的问题适合于此。您可以为此使用的一种框架是 Map/Reduce。
您的问题是否有多个阶段,以至于第一阶段需要一些数据作为输入并生成可以馈送到第二阶段的输出?在这种情况下,您可以让 1 个流程执行第一阶段并为第二阶段生成数据。也许这会减少内存中同时需要的数据量?
你能把你的问题分解成很多小问题,然后重新组合解决方案吗?在这种情况下,您可以产生多个进程,每个进程处理一个小的子问题,并有一个或多个进程最终组合这些结果?
如果 Map-Reduce 适合您,请查看 Hadoop 框架。
关于python - 如何处理 Python 中的大内存占用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9071031/