使用大型数据集不一定会导致内存复杂化。只要您在查看和操作数据时使用合理的方法,您通常可以节俭地使用内存。
在构建处理数据的模型时,您需要考虑两个概念。
执行给定计算需要访问的最小数据元素是什么? 例如,您可能有一个 300GB 的文本文件,其中填充了数字。如果您要计算数字的平均值,请一次读取一个数字以计算运行平均值。在此示例中,最小元素是文件中的单个数字,因为这是我们数据集中在任何时间点都需要考虑的唯一元素。
您如何为您的应用程序建模,以便在计算期间一次一个地迭代地访问这些元素? 在我们的示例中,我们不会一次读取整个文件,而是一次从文件中读取一个数字。使用这种方法,我们使用少量内存,但可以处理任意大的数据集。与其在内存中传递对数据集的引用,不如传递数据集的视图,它知道如何按需从其中加载特定元素(一旦使用就可以释放)。这在原理上类似于缓冲,并且是许多迭代器采用的方法(例如,xrange
的open
文件对象等)。
In general, the trick is understanding how to break your problem down into tiny, constant-sized pieces, and then stitching those pieces together one by one to calculate a result. You'll find these tenants of data processing go hand-in-hand with building applications that support massive parallelism, as well.
Looking towards gc
is jumping the gun. You've provided only a high-level description of what you are working on, but from what you've said, there is no reason you need to complicate things by poking around in memory management yet. Depending on the type of analytics you are doing, consider investigating numpy
which aims to lighten the burden of heavy statistical analysis.