關(guān)于python函數(shù)釋放內(nèi)存的信息

如何釋放Python占用的內(nèi)存

1.充分利用內(nèi)存

站在用戶的角度思考問題,與客戶深入溝通,找到武安網(wǎng)站設(shè)計(jì)與武安網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站制作、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、主機(jī)域名、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋武安地區(qū)。

任何一種圖像處理軟件對內(nèi)存的要求都很高,Photoshop也一樣。如果你在使用Photoshop時(shí),沒有使用其它的一些大軟件,這時(shí)你就可以將Photoshop占用內(nèi)存資源的比例提高。方法是:進(jìn)行Photoshop,選擇菜單下File\Preference\Memory Image Cache命令,將Used by Photoshop的比例提高到80%~90%即可。

2.指定虛擬內(nèi)存

在處理Photoshop時(shí),內(nèi)存被用完是很正常的,到時(shí)會(huì)大大影響Photoshop處理圖像的時(shí)間,哪將怎么解決呢?方法是:你可以用硬盤來作為內(nèi)存來使用,也就是常說的虛擬內(nèi)存。請選擇菜單下“File\Preference\Plug-Ins Scratch Disks”命令。在這里的Scratch Disks下,你可以在硬盤上指定四個(gè)驅(qū)動(dòng)器來作為虛擬內(nèi)存,軟件默認(rèn)的虛擬內(nèi)存是在Windows\temp之下。當(dāng)?shù)谝粋€(gè)虛擬內(nèi)存被使用光之后,Photoshop會(huì)自動(dòng)去使用第二個(gè)Scratch Dsik,這樣就提高了執(zhí)行速度。

3.釋放內(nèi)存與硬盤空間

在進(jìn)行圖像處理時(shí),你所進(jìn)行的所有操作將會(huì)記錄在Photoshop的History(歷史記錄)工作板中。這些操作包括:復(fù)制到Clipboard(粘貼板)、Undo(恢復(fù))、Pattern(填充物)、Histories(記錄)等幾種,選擇菜單下“Edit\Purge”命令。

進(jìn)行這些操作之后,Photoshop會(huì)將這些圖像和數(shù)據(jù)保存在內(nèi)存里,使用該命令后,即將這些被占用的內(nèi)存空間釋放出來(RAM:Oh! Freeden)這樣就讓Photoshop有更多的Resource(資源)可用,自然就提高了效率。但注意,如果這些操作占用的內(nèi)存比較少時(shí),就沒有必要使用啦!

除此之外,在處理大型圖片時(shí),Photoshop會(huì)自動(dòng)產(chǎn)生一些臨時(shí)文件,一般都很大,如果你處理的是一個(gè)20MB大小的宣傳畫時(shí),那么臨時(shí)文件可能就是100~150MB。請?jiān)赪indows\temp或在你設(shè)定虛擬內(nèi)存的驅(qū)動(dòng)器里,將產(chǎn)生的Photoshop臨時(shí)文件*.tmp刪除掉。

python寫入access數(shù)據(jù)庫釋放內(nèi)存

.前提創(chuàng)建數(shù)據(jù)庫和表格式

[[email protected] ~]# mysql -uroot -pcentos

mysql create database memory;

mysql use memory;

mysql create table memory (memory int,time varchar(50));

2.編寫每睡眠一秒就將系統(tǒng)use_mem內(nèi)存寫入數(shù)據(jù)庫

#!/usr/bin/env python

#-*- coding: UTF-8 -*-

import time #導(dǎo)入時(shí)間模塊

import MySQLdb as mysql #導(dǎo)入MySQLdb模塊

db=mysql.connect(user='root',passwd='centos',db='memory',host='localhost') #連接數(shù)據(jù)庫

cursor=db.cursor() #創(chuàng)建游標(biāo)對象

def getMem():

f = open('/proc/meminfo')

total = int(f.readline().split()[1])

free = int(f.readline().split()[1])

buffer = int(f.readline().split()[1])

cache = int(f.readline().split()[1])

mem_used = total - free - buffer - cache

cur_time =time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))

sql = 'insert into memory (memory, time) value (%s,%s)'%(mem_used,cur_time)

cursor.execute(sql) #執(zhí)行sql語句

print 'ok'

while True:

getMem()

time.sleep(1) # sleep 1 second

3.執(zhí)行腳本,查看數(shù)據(jù)庫

Python 的內(nèi)存管理機(jī)制

Python采用自動(dòng)內(nèi)存管理,即Python會(huì)自動(dòng)進(jìn)行垃圾回收,不需要像C、C++語言一樣需要程序員手動(dòng)釋放內(nèi)存,手動(dòng)釋放可以做到實(shí)時(shí)性,但是存在內(nèi)存泄露、空指針等風(fēng)險(xiǎn)。

Python自動(dòng)垃圾回收也有自己的優(yōu)點(diǎn)和缺點(diǎn):優(yōu)點(diǎn):

缺點(diǎn):

Python的垃圾回收機(jī)制采用 以引用計(jì)數(shù)法為主,分代回收為輔 的策略。

先聊引用計(jì)數(shù)法,Python中每個(gè)對象都有一個(gè)核心的結(jié)構(gòu)體,如下

一個(gè)對象被創(chuàng)建時(shí),引用計(jì)數(shù)值為1,當(dāng)一個(gè)變量引用一個(gè)對象時(shí),該對象的引用計(jì)數(shù)ob_refcnt就加一,當(dāng)一個(gè)變量不再引用一個(gè)對象時(shí),該對象的引用計(jì)數(shù)ob_refcnt就減一,Python判斷是否回收一個(gè)對象,會(huì)將該對象的引用計(jì)數(shù)值ob_refcnt減一判斷結(jié)果是否等于0,如果等于0就回收,如果不等于0就不回收,如下:

一個(gè)對象在以下三種情況下引用計(jì)數(shù)會(huì)增加:

一個(gè)對象在以下三種情況引用計(jì)數(shù)會(huì)減少:

驗(yàn)證案例:

運(yùn)行結(jié)果:

事實(shí)上,關(guān)于垃圾回收的測試,最好在終端環(huán)境下測試,比如整數(shù)257,它在PyCharm中用下面的測試代碼打印出來的結(jié)果是4,而如果在終端環(huán)境下打印出來的結(jié)果是2。這是因?yàn)榻K端代表的是原始的Python環(huán)境,而PyCharm等IDE做了一些特殊處理,在Python原始環(huán)境中,整數(shù)緩存的范圍是在 [-5, 256] 的雙閉合區(qū)間內(nèi),而PyCharm做了特殊處理之后,PyCharm整數(shù)緩存的范圍變成了 [-5, 無窮大],但我們必須以終端的測試結(jié)果為主,因?yàn)樗淼氖窃嫉腜ython環(huán)境,并且代碼最終也都是要發(fā)布到終端運(yùn)行的。

好,那么回到終端,我們來看兩種特殊情況

前面學(xué)習(xí)過了,整數(shù)緩存的范圍是在 [-5, 256] 之間,這些整數(shù)對象在程序加載完全就已經(jīng)駐留在內(nèi)存之中,并且直到程序結(jié)束退出才會(huì)釋放占有的內(nèi)存,測試案例如下:

如果字符串的內(nèi)容只由字母、數(shù)字、下劃線構(gòu)成,那么它只會(huì)創(chuàng)建一個(gè)對象駐留在內(nèi)存中,否則,每創(chuàng)建一次都是一個(gè)新的對象。

引用計(jì)數(shù)法有缺陷,它無法解決循環(huán)引用問題,即A對象引用了B對象,B對象又引用了A對象,這種情況下,A、B兩個(gè)對象都無法通過引用計(jì)數(shù)法來進(jìn)行回收,有一種解決方法是程序運(yùn)行結(jié)束退出時(shí)進(jìn)行回收,代碼如下:

前面講過,Python垃圾回收機(jī)制的策略是 以引用計(jì)數(shù)法為主,以分代回收為輔 。分代回收就是為了解決循環(huán)引用問題的。

Python采用分代來管理對象的生命周期:第0代、第1代、第2代,當(dāng)一個(gè)對象被創(chuàng)建時(shí),會(huì)被分配到第一代,默認(rèn)情況下,當(dāng)?shù)?代的對象達(dá)到700個(gè)時(shí),就會(huì)對處于第0代的對象進(jìn)行檢測和回收,將存在循環(huán)引用的對象釋放內(nèi)存,經(jīng)過垃圾回收后,第0代中存活的對象會(huì)被分配為第1代,同樣,當(dāng)?shù)?代的對象個(gè)數(shù)達(dá)到10個(gè)時(shí),也會(huì)對第1代的對象進(jìn)行檢測和回收,將存在循環(huán)引用的對象釋放內(nèi)存,經(jīng)過垃圾回收后,第1代中存活的對象會(huì)被分配為第2代,同樣,當(dāng)?shù)诙膶ο髠€(gè)數(shù)達(dá)到10個(gè)時(shí),也會(huì)對第2代的對象進(jìn)行檢測和回收,將存在循環(huán)引用的對象釋放內(nèi)存。Python就是通過這樣一種策略來解決對象之間的循環(huán)引用問題的。

測試案例:

運(yùn)行結(jié)果:

如上面的運(yùn)行結(jié)果,當(dāng)?shù)谝淮袑ο蟮膫€(gè)數(shù)達(dá)到699個(gè)即將突破臨界值700時(shí)(在打印699之前就已經(jīng)回收了,所以看不到698和699)進(jìn)行了垃圾回收,回收掉了循環(huán)引用的對象。

第一代、第二代、第三代分代回收都是有臨界值的,這個(gè)臨界值可以通過調(diào)用 gc.get_threshold 方法查看,如下:

當(dāng)然,如果對默認(rèn)臨界值不滿意,也可以調(diào)用 gc.set_threshold 方法來自定義臨界值,如下:

最后,簡單列出兩個(gè)gc的其它方法,了解一下,但禁止在程序代碼中使用

以上就是對Python垃圾回收的簡單介紹,當(dāng)然,深入研究肯定不止這些內(nèi)容,目前,了解到這個(gè)程度也足夠了。

python 怎么在循環(huán)中釋放內(nèi)存

python 怎么在循環(huán)中釋放內(nèi)存

#include"stdio.h"

main()

{

char st[15];

printf("input string:\n");

gets(st);

puts(st);

}

可以看出當(dāng)輸入的字符串中含有空格時(shí),輸出仍為全部字符串。說明gets函數(shù)并不以空格作為字符串輸入結(jié)束的標(biāo)志,而只以回車作為輸入結(jié)束。這是與scanf函數(shù)不同的。

3. 字符串連接函數(shù)strcat

格式: strcat (字符數(shù)組名1,字符數(shù)組名2)

功能:把字符數(shù)組2中的字符串連接到字符數(shù)組1 中字符串的后面,并刪去字符串1后的串標(biāo)志“\0”。本函數(shù)返回值是字符數(shù)組1的首地址。

【例7.14】

分享題目:關(guān)于python函數(shù)釋放內(nèi)存的信息
本文鏈接:http://muchs.cn/article32/dospcpc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、定制開發(fā)、域名注冊、外貿(mào)建站、網(wǎng)頁設(shè)計(jì)公司、企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作