基于Python制作一個(gè)解壓的內(nèi)存加速球
寫在前面
安全管家助手什么的上總會(huì)帶一個(gè)內(nèi)存加速球,有關(guān)掉進(jìn)程以及內(nèi)存清理的功能。雖然本質(zhì)上,內(nèi)存清理只是個(gè)幌子實(shí)際沒啥作用,但是當(dāng)你深度清理之后,肉眼可見的內(nèi)存下降確實(shí)很解壓。不過每次都得打開安全軟件才能享受解壓的快感實(shí)在是有些買櫝還珠了,所以就想嘗試一下自己寫個(gè)玩玩。
內(nèi)存清理
這里我使用python來編寫。
搜索了一下,我確定了兩個(gè)方案,一個(gè)是通過windows自帶的內(nèi)存回收機(jī)制清理,另一個(gè)是通過windows提供的一個(gè)APIEmptyWorkingSet清理,下面我們就來對(duì)比一下。
windows自帶的內(nèi)存回收機(jī)制
通過申請(qǐng)大量的內(nèi)存來觸發(fā)windows的內(nèi)存回收機(jī)制,從而清理內(nèi)存。
import psutil import ctypes mem = psutil.virtual_memory() size = mem.total // 2 buffer = ctypes.create_string_buffer(size) del buffer
這里通過psutil獲取到內(nèi)存總數(shù),并且通過ctypes庫(kù)來創(chuàng)建了一個(gè)一半總數(shù)的緩沖區(qū),隨后立馬刪掉。
但是,這樣會(huì)造成臨時(shí)的卡頓,并且肉眼可見的內(nèi)存上漲。而且清理的不干凈。果斷放棄這個(gè)方案,一點(diǎn)都不順暢。
EmptyWorkingSet
EmptyWorkingSet是windows的一個(gè)API,它用來清空指定進(jìn)程的內(nèi)存中的工作集。將該程序所用的物理內(nèi)存定義為臟頁(yè)并轉(zhuǎn)移到磁盤上的內(nèi)存交換文件上,清空該進(jìn)程占用的物理內(nèi)存,當(dāng)進(jìn)程再次需要時(shí)會(huì)再次從外存進(jìn)行加載。那么加載的過程中可能會(huì)導(dǎo)致臨時(shí)的卡頓。
市面上的加速球大多用的都應(yīng)該是這個(gè)技術(shù)
通過psutil庫(kù),以及搭配win32相關(guān)的庫(kù),實(shí)現(xiàn)起來也很方便
import win32api import win32con import win32process import psutil for pid in psutil.pids(): try: handle = win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS, False, pid) win32process.SetProcessWorkingSetSize(handle, -1, -1) win32api.EmptyWorkingSet(handle) except Exception: continue
而經(jīng)過與某管家進(jìn)行對(duì)比,發(fā)現(xiàn)效果大差不大,他們可能做了一些內(nèi)存整理的優(yōu)化。
進(jìn)程終止
殺死進(jìn)程就更簡(jiǎn)單了,這里為了避免出問題,我只保留他們的父進(jìn)程,依舊是通過psutil來實(shí)現(xiàn)
import psutil pid_set = set() processes = [] # 只遍歷正在運(yùn)行的進(jìn)程 for pid in psutil.pids(): if pid in pid_set: continue try: proc = psutil.Process(pid) except psutil.NoSuchProcess: continue # 只處理父進(jìn)程 proc_p = proc.parent() if proc_p is not None: proc = proc_p if proc.pid in pid_set: continue pid_set.add(proc.pid) # 生成進(jìn)程信息 process_info = proc.as_dict(attrs=['pid', 'name', 'username', 'status', 'memory_info']) process.append(process_info)
而殺死進(jìn)程則是通過如下代碼實(shí)現(xiàn),pid就是指定進(jìn)程的pid
psutil.Process(pid).kill()
至此,核心功能算是搞完了
完整開發(fā)
既然是加速球,那肯定需要一個(gè)界面,這里自己隨手PS畫了個(gè)圖,然后用PyQt5寫了個(gè)界面出來(寫的時(shí)候?qū)嵲谑菒盒耐铝耍?/p>
最后的一個(gè)效果如下
雙擊便可進(jìn)行內(nèi)存清理
右鍵便可打開進(jìn)程管理,在進(jìn)程管理界面點(diǎn)擊右鍵即可關(guān)閉
每次只會(huì)顯示內(nèi)存占用最多的前十五個(gè)進(jìn)程,點(diǎn)擊即殺死進(jìn)程
同時(shí)為了趣味性,我還設(shè)置了單次分?jǐn)?shù)和成就,當(dāng)你達(dá)到100分時(shí),即可解鎖藍(lán)屏見證者稱號(hào)。(狗頭)
項(xiàng)目地址:github.com/SSRemex/MemeoryCleaner
到此這篇關(guān)于基于Python制作一個(gè)解壓的內(nèi)存加速球的文章就介紹到這了,更多相關(guān)Python內(nèi)存加速球內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pandas 將list切分后存入DataFrame中的實(shí)例
今天小編就為大家分享一篇pandas 將list切分后存入DataFrame中的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07python項(xiàng)目導(dǎo)入open3d后報(bào)錯(cuò)ImportError:DLL load failed:找不到
這篇文章主要介紹了python項(xiàng)目導(dǎo)入open3d后報(bào)錯(cuò)ImportError:DLL load failed:找不到指定的模塊問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08利用Python開發(fā)Markdown表格結(jié)構(gòu)轉(zhuǎn)換為Excel工具
在數(shù)據(jù)管理和文檔編寫過程中,我們經(jīng)常使用 Markdown 來記錄表格數(shù)據(jù),但它沒有Excel使用方便,所以本文將使用Python編寫一個(gè)轉(zhuǎn)換工具,希望對(duì)大家有所幫助2025-03-03教你用python3根據(jù)關(guān)鍵詞爬取百度百科的內(nèi)容
這篇文章介紹的是利用python3根據(jù)關(guān)鍵詞爬取百度百科的內(nèi)容,注意本文用的是python3版本以及根據(jù)關(guān)鍵詞爬取,爬取也只是單純的爬網(wǎng)頁(yè)信息,有需要的可以參考借鑒。2016-08-08使用Python的Turtle繪制哆啦A夢(mèng)實(shí)例
今天小編就為大家分享一篇使用Python的Turtle繪制哆啦A夢(mèng)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-11-11matplotlib之pyplot模塊之標(biāo)題(title()和suptitle())
這篇文章主要介紹了matplotlib之pyplot模塊之標(biāo)題(title()和suptitle()),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02Gradio機(jī)器學(xué)習(xí)模型快速部署工具quickstart
這篇文章主要為大家介紹了Gradio機(jī)器學(xué)習(xí)模型快速部署工具quickstart,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04pycharm 實(shí)現(xiàn)本地寫代碼,服務(wù)器運(yùn)行的操作
這篇文章主要介紹了pycharm 實(shí)現(xiàn)本地寫代碼,服務(wù)器運(yùn)行的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-06-06