亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python實現(xiàn)監(jiān)視程序的內(nèi)存使用情況

 更新時間:2023年12月20日 17:05:32   作者:設(shè)計干貨鋪  
我們使用Python和它的數(shù)據(jù)處理庫套件進行大量數(shù)據(jù)處理時候,可能使用了大量的計算資源,那么如何監(jiān)視程序的內(nèi)存使用情況就顯得尤為重要,下面我們就來了解一下具體實現(xiàn)方法吧

我們使用Python和它的數(shù)據(jù)處理庫套件(如panda和scikiti -learn)進行大量數(shù)據(jù)處理時候,可能使用了大量的計算資源。如何監(jiān)視程序的內(nèi)存使用情況就顯得尤為重要。

1.詢問操作系統(tǒng)

跟蹤內(nèi)存使用情況的最簡單方法是使用操作系統(tǒng)本身。您可以使用top來提供您在一段時間內(nèi)使用的資源的概述?;蛘?,如果您想要現(xiàn)場檢查資源使用情況,您可以使用ps命令:

$ ps -m -o %cpu,%mem,command
%CPU %MEM COMMAND
23.4  7.2 python analyze_data.py
 0.0  0.0 bash

m標志指示ps按照進程使用最多內(nèi)存的順序顯示結(jié)果。o標志控制顯示每個進程的哪些屬性——在本例中是使用的CPU百分比、消耗的系統(tǒng)內(nèi)存百分比和正在執(zhí)行的進程的命令行。

CPU百分比將一個完整的CPU核心計算為100%的使用率,因此如果您有一個4核的機器,可能會看到總計高達400%的CPU使用率。還有其他輸出選項用于顯示其他進程屬性,以及用于控制顯示哪些進程的ps的其他標志。

結(jié)合一些創(chuàng)造性的shell腳本,可以編寫一個監(jiān)視腳本,使用ps跟蹤任務(wù)的內(nèi)存使用情況。

2.tracemalloc

Python解釋器的操作中有大量的hooks,可以在Python代碼運行時用于監(jiān)視和內(nèi)省。pdb使用這些鉤子來提供調(diào)試;覆蓋率也使用它們來提供測試覆蓋率。tracemalloc模塊還使用它們來提供一個了解內(nèi)存使用情況的窗口。

tracemalloc是在Python 3.4中添加的一個標準庫模塊,它跟蹤Python解釋器分配的每個單獨的內(nèi)存塊。tracemalloc能夠提供關(guān)于運行Python進程中內(nèi)存分配的非常細粒度的信息:

import tracemalloc

tracemalloc.start()
my_complex_analysis_method()
current, peak = tracemalloc.get_traced_memory()
print(f"Current memory usage is {current / 10**6}MB; Peak was {peak / 10**6}MB")
tracemalloc.stop()

調(diào)用tracemplugin .start()啟動跟蹤進程。在進行跟蹤時,您可以詢問分配了哪些內(nèi)容的詳細信息;在本例中,我們只要求當前和峰值內(nèi)存分配。調(diào)用tracemplugin .stop()將刪除hook并清除已經(jīng)收集的任何跟蹤。

不過,這種程度的細節(jié)是要付出代價的。tracemalloc將自己深深地注入到正在運行的Python進程中——正如您所預(yù)期的那樣,這會帶來性能損失。在我們的測試中,我們觀察到在運行分析時使用tracemalloc的速度下降了30%。在分析單個進程時,這可能是可以的,但在生產(chǎn)中,您確實不希望僅僅為了監(jiān)視內(nèi)存使用情況而降低30%的性能。

3.抽樣

幸運的是,Python標準庫提供了另一種觀察內(nèi)存使用情況的方法—resource模塊。resource模塊為程序分配的資源提供基本控制,包括內(nèi)存使用:

import resource
usage = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss

getrusage()的調(diào)用返回程序所使用的資源。常量RUSAGE_SELF表示我們只對這個進程使用的資源感興趣,而不是它的子進程。返回的對象是一個結(jié)構(gòu),它包含一系列操作系統(tǒng)資源,包括CPU時間、信號、上下文切換等;但就我們的目的而言,我們感興趣的是maxrss——最大駐留集大小——它是進程當前在RAM中持有的內(nèi)存量。

但是,與tracemalloc模塊不同的是,資源模塊不隨時間跟蹤使用情況—它只提供點采樣。因此,我們需要實現(xiàn)一種方法來隨時間對內(nèi)存使用情況進行采樣。

首先,我們定義一個類來執(zhí)行內(nèi)存監(jiān)控:

import resource
from time import sleep

class MemoryMonitor:
    def __init__(self):
        self.keep_measuring = True

    def measure_usage(self):
        max_usage = 0
        while self.keep_measuring:
            max_usage = max(
                max_usage,
                resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
            )
            sleep(0.1)

        return max_usage

在這個類的實例上調(diào)用measure_usage()時,它將進入一個循環(huán),每0.1秒測量一次內(nèi)存使用情況。將跟蹤內(nèi)存使用量的任何增加,并在循環(huán)退出時返回最大內(nèi)存分配。

但是什么告訴循環(huán)退出呢?我們在哪里調(diào)用被監(jiān)視的代碼?我們在單獨的線程中完成。

from concurrent.futures import ThreadPoolExecutor


with ThreadPoolExecutor() as executor:
    monitor = MemoryMonitor()
    mem_thread = executor.submit(monitor.measure_usage)
    try:
        fn_thread = executor.submit(my_analysis_function)
        result = fn_thread.result()

    finally:
        monitor.keep_measuring = False
        max_usage = mem_thread.result()

    print(f"Peak memory usage: {max_usage}")

ThreadPoolExecutor為提交要在線程中執(zhí)行的任務(wù)提供了一種方便的方法。我們向執(zhí)行程序提交兩個任務(wù)——監(jiān)視器和my_analysis_function(如果分析函數(shù)需要額外的參數(shù),可以通過提交調(diào)用傳入它們)。

對fn_thread.result()的調(diào)用將被阻塞,直到分析函數(shù)完成并獲得其結(jié)果,此時我們可以通知監(jiān)視器停止并獲得最大內(nèi)存。try/finally模塊確保了如果分析函數(shù)拋出異常,內(nèi)存線程仍然會被終止。

使用這種方法,我們可以有效地隨時間對內(nèi)存使用情況進行抽樣。大部分工作將在主分析線程中完成;但是每0.1秒,監(jiān)視器線程就會被喚醒,進行一次內(nèi)存測量,如果內(nèi)存使用量增加就將其存儲,然后返回睡眠狀態(tài)。

到此這篇關(guān)于Python實現(xiàn)監(jiān)視程序的內(nèi)存使用情況的文章就介紹到這了,更多相關(guān)Python監(jiān)視內(nèi)存使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python利用GDAL模塊實現(xiàn)讀取柵格數(shù)據(jù)并對指定數(shù)據(jù)加以篩選掩膜

    Python利用GDAL模塊實現(xiàn)讀取柵格數(shù)據(jù)并對指定數(shù)據(jù)加以篩選掩膜

    這篇文章主要為大家詳細介紹了如何基于Python語言中g(shù)dal模塊,對遙感影像數(shù)據(jù)進行柵格讀取與計算,同時基于QA波段對像元加以篩選、掩膜的操作,需要的可以參考一下
    2023-02-02
  • Python獲取指定日期是"星期幾"的6種方法

    Python獲取指定日期是"星期幾"的6種方法

    在Python進行數(shù)據(jù)分析時,按照日期進行分組匯總也是被需要的,比如會找到銷量的周期性規(guī)律。本文將以2022-02-22為例,演示Python獲取指定日期是“星期幾”的6種方法,需要的可以參考一下
    2022-03-03
  • 在python中創(chuàng)建表格的兩種方法實例

    在python中創(chuàng)建表格的兩種方法實例

    Python 是一種解釋型、面向?qū)ο?、動態(tài)數(shù)據(jù)類型的高級程序設(shè)計語言,下面這篇文章主要給大家介紹了關(guān)于如何在python中創(chuàng)建表格的兩種方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-01-01
  • 解決django 新增加用戶信息出現(xiàn)錯誤的問題

    解決django 新增加用戶信息出現(xiàn)錯誤的問題

    今天小編就為大家分享一篇解決django 新增加用戶信息出現(xiàn)錯誤的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • 表格梳理解析python內(nèi)置時間模塊看完就懂

    表格梳理解析python內(nèi)置時間模塊看完就懂

    這篇文章主要介紹了python內(nèi)置的時間模塊,本文用表格方式清晰的對Python內(nèi)置時間模塊進行語法及用法的梳理解析,有需要的朋友建議收藏參考
    2021-10-10
  • 詳解python ThreadPoolExecutor異常捕獲

    詳解python ThreadPoolExecutor異常捕獲

    本文主要介紹了詳解python ThreadPoolExecutor異常捕獲,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • python分數(shù)實例用法

    python分數(shù)實例用法

    在本篇文章里小編給大家整理的是一篇關(guān)于python分數(shù)實例用法的相關(guān)內(nèi)容,有興趣的朋友們可以學習下。
    2021-04-04
  • 裝上這 14 個插件后,PyCharm 真的是無敵的存在

    裝上這 14 個插件后,PyCharm 真的是無敵的存在

    這篇文章主要介紹了裝上這 14 個插件后,PyCharm 真的是無敵的存在,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • python 用遞歸實現(xiàn)通用爬蟲解析器

    python 用遞歸實現(xiàn)通用爬蟲解析器

    這篇文章主要介紹了python 用遞歸實現(xiàn)通用爬蟲解析器的方法,幫助大家更好的理解和學習使用python,感興趣的朋友可以了解下
    2021-04-04
  • 使用pymysql寫入中文的問題

    使用pymysql寫入中文的問題

    這篇文章主要介紹了使用pymysql寫入中文的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評論