第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

用Python釋放內(nèi)存

用Python釋放內(nèi)存

開心每一天1111 2019-07-06 15:42:44
用Python釋放內(nèi)存在下面的示例中,我有幾個有關(guān)內(nèi)存使用的相關(guān)問題。如果我跑到翻譯里,foo = ['bar' for _ in xrange(10000000)]在我的機器上使用的真正內(nèi)存增加到80.9mb..然后我,del foo真正的記憶會下降,但只會30.4mb..解釋器使用4.4mb基線,那么不釋放的好處是什么?26mb對操作系統(tǒng)的記憶?是不是因為Python正在“提前計劃”,認(rèn)為您可能會再次使用那么多內(nèi)存?為什么它會釋放50.5mb特別是-釋放的金額是基于什么?有沒有辦法強迫Python釋放所使用的所有內(nèi)存(如果您知道不會再使用那么多內(nèi)存的話)?注這個問題不同于如何在Python中顯式釋放內(nèi)存?因為這個問題主要是在解釋器通過垃圾收集釋放對象(使用gc.collect或者不是)。
查看完整描述

3 回答

?
三國紛爭

TA貢獻(xiàn)1804條經(jīng)驗 獲得超7個贊

在堆上分配的內(nèi)存可能會受到高水標(biāo)記的影響.Python為分配小對象而進(jìn)行的內(nèi)部優(yōu)化(PyObject_Malloc)在4個Kib池中,按8字節(jié)的倍數(shù)對分配大小進(jìn)行了分類-最多256個字節(jié)(在3.3中為512字節(jié))。池本身在256個Kib競技場中,所以如果只使用一個池中的一個塊,整個256 Kib競技場就不會被釋放。在Python3.3中,小對象分配器被轉(zhuǎn)換為使用匿名內(nèi)存映射而不是堆,因此它在釋放內(nèi)存方面應(yīng)該表現(xiàn)得更好。

此外,內(nèi)置類型維護(hù)以前分配的對象的自由職業(yè)者,這些對象可以使用小對象分配器,也可以不使用。這個int類型使用自己分配的內(nèi)存維護(hù)自由職業(yè)者,清除它需要調(diào)用PyInt_ClearFreeList()..這可以通過執(zhí)行完整的操作間接調(diào)用。gc.collect.

像這樣試試,告訴我你得到了什么。這是鏈接psutil.Process.Memory_info.

import osimport gcimport psutil

proc = psutil.Process(os.getpid())gc.collect()mem0 = proc.get_memory_info().rss# create approx. 10**7 int objects and pointersfoo = 
['abc' for x in range(10**7)]mem1 = proc.get_memory_info().rss# unreference, including x == 9999999del foo, x
mem2 = proc.get_memory_info().rss# collect() calls PyInt_ClearFreeList()# or use ctypes: pythonapi.PyInt_ClearFreeList()gc.collect()mem3 = 
proc.get_memory_info().rss

pd = lambda x2, x1: 100.0 * (x2 - x1) / mem0print "Allocation: %0.2f%%" % pd(mem1, mem0)print "Unreference: %0.2f%%" % pd(mem2, mem1)print
 "Collect: %0.2f%%" % pd(mem3, mem2)print "Overall: %0.2f%%" % pd(mem3, mem0)

產(chǎn)出:

Allocation: 3034.36%Unreference: -752.39%Collect: -2279.74%Overall: 2.23%

編輯:

我切換到相對于進(jìn)程VM大小的測量,以消除系統(tǒng)中其他進(jìn)程的影響。

當(dāng)頂部連續(xù)的空閑空間達(dá)到常數(shù)、動態(tài)或可配置的閾值時,C運行時(例如glibc、msvcrt)會收縮堆。使用glibc,您可以使用mallopt(M_TRIM_閾值)??紤]到這一點,如果堆的收縮幅度更大(甚至更大),也就不足為奇了。free.

在3.xrange不會創(chuàng)建列表,所以上面的測試不會創(chuàng)建1000萬int物品。即使是這樣,int輸入3.x基本上是2.xlong并不能實現(xiàn)一個自由職業(yè)者。


查看完整回答
反對 回復(fù) 2019-07-06
?
慕尼黑的夜晚無繁華

TA貢獻(xiàn)1864條經(jīng)驗 獲得超6個贊

eryksun已經(jīng)回答了問題#1,我已經(jīng)回答了問題#3(原來的#4),但是現(xiàn)在讓我們回答問題2:

為什么它特別發(fā)布了50.5mb-釋放的數(shù)量是基于什么?

它的基礎(chǔ)是,最終,在Python和malloc很難預(yù)測。

首先,取決于您如何度量內(nèi)存,您可能只測量實際映射到內(nèi)存中的頁面。在這種情況下,每當(dāng)頁面被尋呼機交換出來時,內(nèi)存就會顯示為“已釋放的”,盡管它還沒有被釋放。

或者您可能正在測量正在使用的頁面,這些頁面可能計算也可能不計算已分配但從未接觸過的頁面(在樂觀地過度分配的系統(tǒng)中,如linux),這些頁面被分配但被標(biāo)記。MADV_FREE

如果您確實是在測量已分配的頁面(這實際上并不是一件非常有用的事情,但這似乎是您要問的),并且頁面實際上已被取消分配,在兩種情況下可能會發(fā)生這種情況:要么您已經(jīng)使用brk或等效于縮小數(shù)據(jù)段(現(xiàn)在非常罕見),或者您已經(jīng)使用了munmap或類似于發(fā)布映射段。(從理論上講,后者也有一個次要的變體,因為有一些方法可以釋放映射段的一部分-例如,用MAP_FIXED為了MADV_FREE段,立即取消映射。)

但是大多數(shù)程序并不直接從內(nèi)存頁面中分配東西;它們使用malloc-樣式分配器。當(dāng)你打電話free,分配程序只能在恰好是free在映射(或數(shù)據(jù)段的最后N頁)中對最后一個活動對象進(jìn)行調(diào)用。您的應(yīng)用程序不可能合理地預(yù)測到這一點,甚至無法檢測到它是預(yù)先發(fā)生的。

cpython使得這個問題更加復(fù)雜-它在自定義內(nèi)存分配程序的基礎(chǔ)上有一個自定義的2級對象分配器。malloc..(見來文提交人的評論以獲得更詳細(xì)的解釋。)最重要的是,即使在CAPI級別,更不用說Python,您甚至都無法直接控制頂級對象何時被釋放。

那么,當(dāng)您釋放一個對象時,您如何知道它是否會將內(nèi)存釋放到操作系統(tǒng)?首先,您必須知道您已經(jīng)發(fā)布了最后一個引用(包括您不知道的任何內(nèi)部引用),允許GC釋放它。(與其他實現(xiàn)不同,至少CPython將在允許的情況下立即釋放對象。)這通常會在下一個級別釋放至少兩件事情(例如,對于一個字符串,您將釋放PyString對象和字符串緩沖區(qū))。

如果你釋放一個對象,要知道這是否會導(dǎo)致下一層釋放一個對象存儲塊,您必須知道對象分配器的內(nèi)部狀態(tài),以及它是如何實現(xiàn)的。(這顯然是不可能發(fā)生的,除非你正在處理塊中的最后一件事,即使這樣,它也可能不會發(fā)生。)

如果你釋放一個對象存儲塊,以確定這是否會導(dǎo)致free調(diào)用時,您必須知道PyMem分配程序的內(nèi)部狀態(tài),以及它是如何實現(xiàn)的。(同樣,您必須在mallocED區(qū)域,即使這樣,也可能不會發(fā)生。)

如果你 free a malloc區(qū)域,以了解這是否會導(dǎo)致munmap或同等(或brk),您必須知道malloc,以及它是如何實現(xiàn)的。而這個,不像其他的,是高度特定于平臺的。(再說一遍,你通常必須把最后一次使用中的東西換掉。mallocmmap段,即使這樣,也可能不會發(fā)生。)

因此,如果您想了解為什么它正好發(fā)布了50.5mb,那么您必須從下到上跟蹤它。為什么malloc當(dāng)你完成一頁或更多頁時,解壓值為50.5mb的頁面free呼叫(可能超過50.5mb)?你得讀你的平臺malloc,然后遍歷各個表和列表以查看其當(dāng)前狀態(tài)。(在某些平臺上,它甚至可以使用系統(tǒng)級別的信息,如果不對系統(tǒng)進(jìn)行離線檢查,幾乎不可能捕獲這些信息,但幸運的是,這通常不是一個問題。)然后你必須在上面的3層做同樣的事情。

所以,這個問題唯一有用的答案是“因為?!?/trans>

除非您正在進(jìn)行資源有限的(例如嵌入式)開發(fā),否則您沒有理由關(guān)心這些細(xì)節(jié)。

如果你做資源有限的開發(fā),了解這些細(xì)節(jié)是無用的;您幾乎必須在所有這些級別上進(jìn)行結(jié)束運行,特別是。mmap應(yīng)用程序級別需要的內(nèi)存(可能在兩者之間有一個簡單的、可理解的、特定于應(yīng)用程序的區(qū)域分配器)。


查看完整回答
反對 回復(fù) 2019-07-06
  • 3 回答
  • 0 關(guān)注
  • 888 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號