【发布时间】:2011-03-24 12:01:21
【问题描述】:
我有一个 Python 程序,它处理相当大的 NumPy 数组(数百兆字节),这些数组以 pickle 文件的形式存储在磁盘上(每个文件一个 ~100MB 数组)。当我想对数据运行查询时,我通过 pickle 加载整个数组,然后执行查询(这样从 Python 程序的角度来看,整个数组都在内存中,即使操作系统正在将其换出) .我这样做主要是因为我相信能够对 NumPy 数组使用矢量化操作会比在每个项目中使用 for 循环快得多。
我在一个网络服务器上运行它,它有内存限制,我很快就会遇到这种限制。我对数据运行了许多不同类型的查询,因此编写“分块”代码从单独的 pickle 文件加载部分数据,处理它们,然后继续到下一个块可能会增加很多复杂性。让这种“分块”对处理这些大型数组的任何函数透明肯定会更好。
似乎理想的解决方案类似于生成器,它定期从磁盘加载数据块,然后将数组值一个接一个地传递出去。这将大大减少程序所需的内存量,而无需对单个查询函数进行任何额外的工作。有可能做这样的事情吗?
【问题讨论】:
-
也许是一个有用的参考:刚刚发现这被称为“核外”任务。
标签: python memory-management numpy lazy-evaluation