簡體   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