[英]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.