我正在研究一个长期运行的Python程序(其中一部分是Flask API,另一部分是实时数据获取器)。
我的长时间运行过程经常(大多数情况下,API可能每秒数百次)对大型数据集进行迭代(对某些经济系列进行第二次观察,例如1-5MB的数据,甚至是更多)。它们还在系列等之间进行插值,比较和计算。
为了保持我的进程活着,我可以在迭代/传递参数/处理这些大数据集时练习什么技术?例如,我应该使用gc模块并手动收集吗?
更新
我最初是一名C / C ++开发人员,并且没有问题(甚至会喜欢)用C ++编写部分。我只是有0经验。我该如何开始?
任何建议都将不胜感激。 谢谢!
答案 0 :(得分:1)
使用大型数据集不一定会导致内存复杂化。只要在查看和操作数据时使用声音方法,通常就可以节省使用内存。
在构建处理数据的模型时,需要考虑两个概念。
执行给定计算需要访问的数据的最小元素是什么?例如,您可能有一个300GB的文本文件,其中包含数字。如果您要计算数字的平均值,请一次读取一个数字来计算运行平均值。在此示例中,最小元素是文件中的单个数字,因为这是我们需要在任何时间点考虑的数据集的唯一元素。
如何为应用程序建模,以便在计算过程中一次一个地迭代访问这些元素?在我们的示例中,我们不是一次读取整个文件,而是我会一次从文件中读取一个数字。使用这种方法,我们使用少量内存,但可以处理任意大的数据集。不要在内存中传递对数据集的引用,而是传递数据集的视图,它知道如何根据需要从中加载特定元素(一旦使用就可以释放)。这在原理上类似于缓冲,是许多迭代器采用的方法(例如,xrange
,open
的文件对象等。)
一般来说,诀窍在于理解如何将问题分解成微小的,恒定大小的碎片,然后将这些碎片一个接一个地拼接在一起以计算结果。您会发现这些数据处理租户与构建支持大规模并行性的应用程序齐头并进。
展望gc
正在跳枪。您只提供了关于您正在处理的内容的高级描述,但是从您所说的内容来看,您还没有理由在内存管理方面进行复杂化。根据您正在进行的分析类型,请考虑调查numpy
,以减轻繁重的统计分析负担。
答案 1 :(得分:0)
如果不真实地查看您的数据/算法,很难说,但以下方法似乎是普遍的:
确保没有内存泄漏,否则迟早会终止您的程序。使用objgraph就可以了 - 很棒的工具!阅读文档 - 它包含了在python程序中可能遇到的内存泄漏类型的很好的例子。
尽可能避免复制数据。例如 - 如果您需要使用部分字符串或进行字符串转换 - 不要创建临时子字符串 - 请使用索引并尽可能保持只读。它可以使你的代码更复杂,更少" pythonic"但这是优化的成本。
仔细使用gc - 它可以让你暂时不负责任,同时不添加任何价值。阅读doc。简单地说:只有在有真正理由的情况下才能直接使用gc,比如Python解释器在分配大的临时整数列表后无法释放内存。
认真考虑在C ++上重写关键部分。现在已经开始考虑这个令人不快的想法,以便在数据变大时做好准备。说真的,它通常以这种方式结束。你也可以尝试Cython它可以加速迭代本身。