繁体   English   中英

Python 运行大量 RAM 和交换的长时间脚本 memory 消耗

[英]Python long time script running huge RAM and swap memory consumption

我正在尝试编写 python 脚本,该脚本将定期(每 20 毫秒)从 USB 端口读取数据并将获得的数据写入 .csv 文件。 程序需要在 RaspberryPi 3B 上运行至少 1 周。 但现在我面临 RAM 和交换 memory 消耗的问题。 在运行 Linux 9 小时后,在终端中仅用一个词“Killed”就终止了我的进程。 我已经使用 psutil 模块检查了 RAM 使用情况,看起来问题出在 RAM 和交换使用情况(崩溃前 1 分钟,整个进程使用了 100% 的交换,并且该进程使用了 57% 的 RAM)。 我试图通过使用 memory 探查器找出这个 memory 泄漏发生在哪里,所以看起来问题出在csv_append function(运行 10 分钟后它增加了 7Mb 的数据),但是当我仔细查看这个 function使用@profiler 装饰器似乎没有泄漏。

这是这个 function 的示例:

def _csv_append(self,data):
        """
        Appends to .csv file
        """
        with open(self.last_file_name, 'a') as csvfile:
            csv_writter = csv.writer(csvfile)
            csv_writter.writerow(data)

有什么我可以在我的程序中改进的,这样它就会停止 memory 泄漏并长时间工作而不会被 Linux OOM 杀死? 在主循环 function 中,除了读取字节,使用int.from_bytes()将它们解释为int ,调用csv_append()并等待是否还有一些时间以确保 0.02s 周期

谢谢您的帮助:)

使用 memory 分析器分析 memory 消耗,没有任何信息可以提供帮助。 似乎是csv_append()中的问题,但没有泄漏每个周期删除所有变量并使用垃圾收集器gc.collect()

我刚刚运行了以下小脚本:

import csv

Iterations = 1_000

def csv_append(data):
    with open("log.csv", "a", newline="") as f:
        writer = csv.writer(f)
        writer.writerow(data)

for i in range(Iterations):
    data = [i, "foo", "bar"]
    csv_append(data)

并使用/usr/bin/time -l./main.py获得了一些基本统计信息:

迭代 即时的 Peak_mem_footprint
1_000 0.06 5_718_848
1_000_000 22.08 5_833_664

我什至没有清除data ,memory 几乎没有变化,迭代次数超过 1000 次。 我不认为这是 CSV 文件打开/写入。

我认为您的程序/设置中还需要考虑其他事项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM