4

我正在开发一个长时间运行的 Python 程序(其中一部分是 Flask API,另一个是实时数据获取器)。

我的两个长时间运行的进程都经常迭代(API 甚至可能每秒执行数百次)在大型数据集(对某些经济系列的逐秒观察,例如价值 1-5MB 的数据甚至更多)。他们还在序列等之间进行插值、比较和计算。

在迭代/作为参数传递/处理这些大型数据集时,为了让我的流程保持活力,我可以练习哪些技术?例如,我应该使用 gc 模块并手动收集吗?

更新

我最初是一名 C/C++ 开发人员,用 C++ 编写部件没有问题(甚至会喜欢)。我只是有 0 经验这样做。我该如何开始?

任何意见,将不胜感激。谢谢!

4

2 回答 2

1

使用大型数据集不一定会导致内存复杂化。只要您在查看和操作数据时使用合理的方法,您通常可以节俭地使用内存。

在构建处理数据的模型时,您需要考虑两个概念。

  1. 执行给定计算需要访问的最小数据元素是什么? 例如,您可能有一个 300GB 的文本文件,其中填充了数字。如果您要计算数字的平均值,请一次读取一个数字以计算运行平均值。在此示例中,最小元素是文件中的单个数字,因为这是我们数据集中在任何时间点都需要考虑的唯一元素。

  2. 您如何为您的应用程序建模,以便在计算期间一次一个地迭代地访问这些元素? 在我们的示例中,我们不会一次读取整个文件,而是一次从文件中读取一个数字。使用这种方法,我们使用少量内存,但可以处理任意大的数据集。与其在内存中传递对数据集的引用,不如传递数据集的视图,它知道如何按需从其中加载特定元素(一旦使用就可以释放)。这在原理上类似于缓冲,并且是许多迭代器采用的方法(例如,xrangeopen文件对象等)。

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.

于 2012-06-05T05:24:56.890 回答
0

如果不真正研究您的数据/算法,很难说,但以下方法似乎是通用的:

  1. 确保您没有内存泄漏,否则它迟早会杀死您的程序。为它使用objgraph - 很棒的工具!阅读文档——它包含了你在 python 程序中可能遇到的内存泄漏类型的很好的例子。

  2. 尽可能避免复制数据。例如 - 如果您需要处理部分字符串或进行字符串转换 - 不要创建临时子字符串 - 使用索引并尽可能长时间保持只读状态。它可以使您的代码更复杂且更少“pythonic”,但这是优化的成本。

  3. 小心使用 gc - 它可以让你处理一段时间不负责任,同时没有增加任何价值。阅读文档。简而言之:只有在有真正理由这样做时才应该直接使用 gc,例如 Python 解释器在分配大的临时整数列表后无法释放内存。

  4. 认真考虑重写 C++ 的关键部分。现在就开始考虑这个令人不快的想法,以便在数据变大时做好准备。严重的是,它通常以这种方式结束。你也可以试试Cython,它可以加速迭代本身。

于 2012-06-05T04:59:29.023 回答