长时间运行的Python程序(使用Pandas)不断增加内存使用量

问题描述 投票:0回答:1

我正在运行一个Python脚本,该脚本使用无限循环内的Pandas函数来处理和处理数据。但是随着时间的推移,该程序似乎正在泄漏内存。

这是由内存分析程序包生成的图形:enter image description here

可悲的是,我无法确定内存使用量增加的根源。据我所知,所有数据(熊猫时间序列)都存储​​在对象Obj中,我使用熊猫函数.memory_usage和objsize函数get_deep_size()跟踪该对象的内存使用情况。根据他们的输出,内存使用量应稳定在90-100 MB之间。除此之外,我看不到内存可以增加的地方。

知道python程序正在docker容器中运行可能很有用。

下面是脚本的简化版本,应阐明基本的工作原理。

from datetime import datetime
from time import sleep
import objsize
from dateutil import relativedelta

def update_data(Obj, now_utctime):
    # attaining the newest timeseries data
    new_data = requests.get(host, start=Obj.data[0].index, end=now_utctime)
    Obj.data.append(new_data)

    # cut off data older than 1 day
    Obj.data.truncate(before=now_utctime-relativedelta.relativedelta(days=1))

class ExampleClass():
    def __init__(self):
        now_utctime = datetime.utcnow()
        data = requests.get(host, start=now_utctime-relativedelta.relativedelta(days=1), end=now_utctime)

Obj = ExampleClass()

while True:
    update_data(Obj, datetime.utcnow())
    logger.info(f"Average at {datetime.utcnow()} is at {Obj.data.mean()}")
    logger.info(f"Stored timeseries memory usage at {Obj.data.memory_usage(deep=True)* 10 ** -6} MB")
    logger.info(f"Stored Object memory usage at {objsize.get_deep_size(Obj) * 10 ** -6} MB")
    time.sleep(60)

任何有关内存增加的建议,或如何进一步研究,都将受到赞赏。

EDIT:查看图表,有可能在我截断之前会有尖峰,但是由于数据输入是稳定的,所以我不知道为什么它不能归一化,而是停留在较高点。然后,即使每个过程都没有另一个更宽泛的周期可以解释这一点,但是每隔第四个周期就会出现一次突然的下降...

python pandas docker memory-management
1个回答
2
投票

如moooeeeep所建议,内存使用量的增加与内存泄漏有关,确切的来源尚待确定。但是,我可以通过在每个循环之后通过gc.collect()手动调用垃圾收集器来解决此问题。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.