Ⅰ python 中的out of memory是怎麼回事,內存不夠嗎
這不是你電腦內存大小的問題,
在編程中,如果在一個域中輸入的數據超過了它的要求就會引發數據溢出問題。
緩沖區溢出好比是將十磅的糖放進一個只能裝五磅的容器里。一旦該容器放滿了,餘下的部分就溢出在櫃台和地板上,弄得一團糟。由於計算機程序的編寫者寫了一些編碼,但是這些編碼沒有對目的區域或緩沖區——五磅的容器——做適當的檢查,看它們是否夠大,能否完全裝入新的內容——十磅的糖,結果可能造成緩沖區溢出的產生。如果打算被放進新地方的數據不適合,溢得到處都是,該數據也會製造很多麻煩。但是,如果緩沖區僅僅溢出,這只是一個問題。到此時為止,它還沒有破壞性。當糖溢出時,櫃台被蓋住。可以把糖擦掉或用吸塵器吸走,還櫃台本來面貌。與之相對的是,當緩沖區溢出時,過剩的信息覆蓋的是計算機內存中以前的內容。除非這些被覆蓋的內容被保存或能夠恢復,否則就會永遠丟失。
具體你可以看下邊的資料。
Ⅱ Python 多進程內存佔用問題
當我們有一個很長很長的任務隊列(mission_list)和閾值對應的一個處理函數(missionFunction)時,我們一般採用如下的方式進行處理:
但是,如果這任務列表很長很長,處理函數很復雜(佔用cpu)時,單核往往需要很長的時間進行處理,此時,Multiprocess便可以極大的提高我們程序的運行速度,州粗相關內容請借鑒 multiprocessing --- 基於進程的並行 — Python 3.10.4 文檔。
以上這種場景下,推薦大家採用最簡單的進程池+map的方法進行處理,標準的寫法, chunksize要借鑒官方的說法,最好大一點 :
但是!!!! 如果我們的任務列表非常的長,這會導致多進程還沒跑起來之前,內存已經撐爆了,任務自然沒法完成,此時我們有幾種辦法進行優化:
進程的啟動方法有三種,可參考官方文檔:
[圖片上傳失敗...(image-48cd3c-1650511153989)]
在linux環境下,使用forkserver可以節省很多的內存空間, 因為進攜跡衡程啟動的是一個服務,不會把主進程的數據全部復制
採用imap會極大的節省空間,它返回的是一個迭代器,也就是結果列表:
但注意,以上寫法中,你寫的結果迭代部分必須寫在with下面。或者採用另一種寫法:
還有最後一種,當你的mission list實在太大了,導致你在生成 mission list的時候已經把內存撐爆了,這個時候就得優化 mission_list了,如果你的mission_list是通過一個for循環生成的,你可以使用yield欄位,將其封裝為一個迭代器,傳入進程池:
這樣子,我們就封裝好了mission_list,它是一個可迭代對象,在取數據的辯做時候才會將數據拉到內存
我在項目中結合了後兩種方法,原本256G的內存都不夠用,但在修改後內存只佔用了不到10G。希望能夠幫助到你
Ⅲ Python的就業方向有哪些
Python十大就業方向:
1、web開發:Python擁有很多免費數據函數庫、免費web網頁模板系統、以及與web伺服器進行交互的庫。可以很好地實現web開發,搭建web框架,比較說diango。
2、桌面軟體:用tkinter/PyQT框架開發各種桌面軟體
3、網路編程:是Python學習的方向之一,網路編程無處不在。
4、爬蟲開發:Python幾乎是霸主地位,將網路一切數據作為資源,通過自動化程序進行有針對性的數據採集以及處理。
5、雲計算:Python是從事雲計算工作需要掌握的一門編程語言,目前非常火熱的OpenStack就是由Python開發的。
6、人工智慧:Python積累了豐富的科學運算庫,Python在眾多語言中脫穎而出,各種人工智慧演算法都是基於Python編寫的。
7、自動化運維:Python是綜合性語言,可以滿足大部分自動化運維需求,前端和後端都可以做。
8、金融分析:金融分析包含金融知識和Python相關模塊的學習,包含NumpyPandasScipy數據分析模塊等。
9、科學運算:是一門非常適合科學計算的編程語言,Python非常適合做科學計算、繪制高質量的2D和3D圖像。
10、游戲開發:游戲開發中,Python也具有非常好的作用,可以用更少的代碼描述游戲業務邏輯。
Ⅳ python編寫中為什麼要使用生成器表達式
就像生成器函數,生成器表達式是一種對內存空間的優化:它們不需要像方括弧的列表推導一樣,一次構造出整個結果列表。與生成器函數一樣,它們將生成結果的過程拆分成更小的時間片:它們會一部分一部分地產生結果,而不是讓調用者在一次調用中等待整個集合被創建出來。
另一方面,生成器表達式在實際中運行起來可能比列表推導稍慢一些,所以它們可能只對那些結果集合非常大的運算或者不能等待全部數據產生的應用來說是最優選擇。
Ⅳ 電腦技術
第一招:關閉多餘程序如果同時打開的文檔過多或者運行的程序過多,就沒有足夠的內存運行其他程序。這時,對於多文檔界面程序,如Word、Excel等,請關閉當前文檔外的所有文檔,並退出當前未使用的程序,或許你就能夠繼續執行因「內存不足」而被中斷的任務。
第二招:清除剪貼板中的內容1.清除系統剪貼板中的內容(存儲Windows復制或剪貼內容的剪貼板)點擊「開始→程序→附件→系統工具→剪貼板查看程序」,在「編輯」菜單上,單擊「刪除」命令,系統彈出「清除剪貼板」對話框,單擊「是」按鈕。2.清除多重剪貼板中的內容(Office程序提供的剪貼板)在「Office剪貼板」任務窗格(OfficeXP)或工具欄(Office2000)上,單擊「全部清空」或「清空『剪貼板』」。當清空「Office剪貼板」時,系統剪貼板也將同時被清空。
第三招:合理設置虛擬內存如果沒有設置Windows虛擬內存,那麼很容易收到「內存不足」的消息。點擊「開始→設置→控制面板」,雙擊「系統」。在「系統屬性」對話框中,單擊「性能」選項卡,然後單擊「虛擬內存」按鈕。選中「讓Windows管理虛擬內存設置-(推薦)」選項,將計算機中可作為虛擬內存使用的硬碟空間量設置為默認值。
第四招:增加可用磁碟空間有四種方法可以增加磁碟的使用空間:1.清空回收站。2.刪除臨時文件。打開%20「我的電腦」,右鍵單擊要釋放其空間的磁碟,然後單擊「屬性」,在「常規」選項卡上,單擊「磁碟清理」按鈕,選中要刪除的不需要的文件前的復選框進行整理。3.從磁碟中刪除過期的文件或已存檔的文件。4.刪除從未使用過的所有文件。
第五招:重新安裝已損壞的程序如果僅僅是使用某個程序時,系統提示內存不足,而其他程序可以正常運行,那麼可能的原因是該程序文件被毀壞,從而導致內存不足的問題。請嘗試刪除並重新安裝該程序,然後重新運行該程序。如果系統不再提示內存不足,那麼說明原程序文件確實被損壞。
第六招:使用內存優化軟體內存優化軟體有很多,比如RAM%20Idle和Memo%20Kit就比較出色。它們可以設置自動清空剪貼板、釋放被關閉程序未釋放的內存,從而免除你手工操作的麻煩,達到自動釋放內存的目的,不妨一試。
第七招:重新啟動計算機如果只退出程序,並不重新啟動計算機,程序可能無法將內存資源歸還給系統。在運行重要程序之前,請重新啟動計算機以充分釋放系統資源。
第八招:減少自動運行的程序如果在啟動Windows時自動運行的程序太多,那麼,即使重新啟動計算機,也沒足夠的內存用來運行其他程序。這時就需要清除一些不必要的系統自啟動程序。
點擊「開始→運行」,輸入msconfig,打開「系統配置實用程序」窗口。單擊「一般」選項卡,選中「選擇性啟動」復選框。去掉%20「處理Win.ini文件」和「載入啟動項」前的復選框。打開「啟動」選項卡,將不需要開機自動啟動的程序都勾除掉就好了。
第九招:查殺病毒系統感染電腦病毒也是導致內存不足的罪魁禍首。當系統出現「內存不足」的錯誤時,請使用最新的殺毒軟體查殺病毒,或許在清除電腦病毒之後,就解決了「內存不足」的問題。
解決「內存不足」的辦法9則
一、剪貼板佔用了太多的內存
實際上,剪貼板是內存中的一塊臨時區域,當你在程序中使用了「復制」或「剪切」命令後,Windows將把復制或剪切的內容及其格式等信息暫時存儲在剪貼板上,以供「粘貼」使用。如果當前剪貼板中存放的是一幅圖畫,則剪貼板就佔用了不少的內存。這時,請按下述步驟清除剪貼板中的內容,釋放其佔用的內存資源:
1.單擊「開始」,指向「程序」或「所有程序」,指向「附件」,指向「系統工具」,然後單擊「剪貼板查看程序」,打開「剪貼板查看程序」窗口。2.在「編輯」菜單上,單擊「刪除」命令。3.關閉「剪貼板查看程序」窗口。
為了與Microsoft Office程序提供的多重剪貼板相區分,上述所說的剪貼板,常被我們稱為系統剪貼板。如果你正在使用Micros OftOffice程序,而且使用了其多重剪貼板功能,那麼你應清空「Office剪貼板」上的項目,方法是:在「Office剪貼板」任務窗格(OfficeXP)或工具欄(Office2000)上,單擊「全部清空」或「清空『剪貼板』」。當清空「Office剪貼板」時,系統剪貼板也將同時被清空
二、打開的程序太多
如果同時打開的文檔過多或者運行的程序過多,就沒有足夠的內存運行其他程序。這時,對於多文檔界面(MDl)程序,如Word、Excel等,請關閉當前文檔外的所有文檔,並退出當前未使用的程序,然後或許你就能夠繼續執行因「內存不足」而被中斷的任務。
三、重新啟動計算機
如果只退出程序,並不重新啟動計算機,程序可能無法將內存資源歸還給系統。請重新啟動計算機以釋放系統資源,然後再次運行程序或執行被中斷的任務。
四、自動運行的程序太多
如果在啟動Windows時自動運行的程序太多,那麼,即使重新啟動計算機,也沒足夠的內存用來運行其它程序。
(一)確定設置為自動運行的程序是否太多
1.單擊「開始」,然後單擊「運行」。
2.在「打開」框中,鍵入「Msconfig」,單擊「確定」按鈕,打開「系統配置實用程序」窗口。
3.單擊「常規」選項卡,選中「選擇性啟動」復選鈕,清除「處理Win.ini文件」復選框和「載入啟動組項目」復選框。
4.單擊「確定」按鈕,當系統提示重新啟動計算機時,請單擊「是」按鈕。
重新啟動電腦後,如果內存不足的問題已經解決,你就可以將計算機配置為啟動時不打開任何程序。
(二)配置計算機不自動打開任何程序
1.恢復在Msconfig中所作的更改,方法是:在「系統配置實用程序」窗口,單擊「常規」選項卡,選擇「正常啟動」,單擊「確定」按鈕,然後重新啟動計算機。
2.刪除「啟動」文件夾中的所有快捷方式
①單擊「開始」,指向「設置」,然後單擊「任務欄和開始菜單」,系統彈出「任務欄屬性」對話框。
②單擊「開始菜單程序」選項卡,單擊「刪除」按鈕。
③單擊「啟動」文件夾旁的加號,以顯示設置為自動運行的程序列表。如果「啟動」文件夾旁沒有加號「+」,則表明沒有設置為自動運行的程序,請單擊「關閉」按鈕以終止此過程。
④單擊「啟動」文件夾中的每個快捷方式,然後單擊「刪除」按鈕。此操作將從「開始」菜單中刪除快捷方式,但並不從硬碟中刪除相應的程序。對於「啟動」文件夾中的每個快捷方式,重復該步驟。
⑤單擊「關閉」按鈕。
⑥單擊「確定」按鈕。
3.禁用從Win.ini文件載入的所有程序
①如上所述打開「系統配置實用程序」窗口。
②單擊「Win.ini」選項卡,雙擊「[windows]」,然後清除「Load=」和「Run=」復選框。
③單擊「確定」按鈕,當系統提示重新啟動計算機時,請單擊「是」按鈕。
五、讓Windows管理虛擬內存設置
如果沒有設置讓Windows管理虛擬內存或者禁用虛擬內存,那麼計算機可能無法正常工作,也可能收到「內存不足」的消息,或在運行某程序時出現相同的錯誤消息。
1.單擊「開始」,單擊「設置」,單擊「控制面板」,然後雙擊「系統」。
2.在「系統屬性」對話框中,單擊「性能」選項卡,然後單擊「虛擬內存」按鈕。
3.選中「讓Windows管理虛擬內存設置—(推薦)」選項,將計算機中可作為虛擬內存使用的硬碟空間量設置為默認值。此時,虛擬內存分頁「win386.swp」能夠根據實際內存的使用情況動態縮小和放大,最小容量為0,最大容量為硬碟的全部可用空間。
4.單擊「確定」按鈕。
六、增加可用磁碟空間
由於Windows以虛擬內存分頁文件的格式使用硬碟空間以模擬RAM(),所以,盡管已設置為讓Windows管理虛擬內存,但是當虛擬內存分頁文件所在的驅動器(默認為Windows系統所在的硬碟分區)沒有足夠的空間時,仍會出現「內存不足」的錯誤。此時,請執行以下一項或多項操作,增加Windows虛擬內存分頁文件所在驅動器上的可用空間:
1.清空回收站,方法是:在桌面上,右鍵單擊「回收站」,再單擊「清空回收站」。
2.從磁碟中刪除臨時文件,方法是:打開「Windows資源管理器」或「我的電腦」窗口,右鍵單擊要釋放其空間的磁碟,然後單擊「屬性」,在「常規」選項卡上,單擊「磁碟清理」按鈕,選中要刪除的不需要的文件前的復選框(如圖3),可以閱讀列表下面區域中每個文件類型的說明,單擊「確定」按鈕。
3.從磁碟中刪除過期的文件或已存檔的文件。
4.刪除從未使用過的所有文件。
七、程序文件被毀壞
如果僅僅是使用某個程序時,系統提示內存不足,而其他程序可以正常運行,那麼可能的原因是該程序文件被毀壞,從而導致內存問題。然而Windows並沒有確切地提示表明該程序已損壞,所以請嘗試刪除並重新安裝該程序,然後重新運行該程序。如果系統不再提示內存不足,那麼說明原程序文件確實被損壞。
八、使用內存優化軟體
內存優化軟體有很多,比如RAM Idle和Memo Kit就是比較出色的兩個。這些軟體都可以設置自動清空剪貼板、釋放被關閉程序未釋放的內存、對Win386.swp文件進行重新組織等,從而免除你手工操作的麻煩,達到自動釋放內存的目的,不妨一試!
九、查殺病毒
系統感染電腦病毒也是導致內存不足的罪魁禍首,當系統出現「內存不足」的錯誤時,請使用最新的防毒軟體查殺病毒,或者在清除電腦病毒之後,就解決了「內存不足」的問題。
Windows本身是內存消耗大戶,會佔用大量的系統資源,如果物理內存不多,經常會因為佔用物理內存過多導致提示內存不足。但有時,Windows中的內存不足提示並不一定能准確反映出導致問題的原因。一般來說,Windows系統會在以下幾種情況下提示「內存不足」:
第一,用Windows附帶的記事本程序拷貝一些網路上的信息,准備匯總後編輯——但是當粘貼了幾次後,經常會跳出一個對話框,說「內存不足,***文件無法被保存」。這一提示容易讓人誤認為是內存出了問題,如果按此提示去查找原因,費時費力也解決不了問題。其實這是記事本程序本身的功能限制和設計的問題,超過64K位元組的內容就不能再編輯了。
第二,在瀏覽網頁的時候經常跳出「內存不足」的提示。由於Windows沒有詳細描述內存、虛擬內存和臨時文件緩沖區的不同,所以經常使人誤以為是物理內存出現問題。其實在很多時候,這是由於IE屬性設置中分配給internet臨時文件的磁碟空間的大小不夠造成,從而導致離線瀏覽的內容無法被保存。要解決這一問題,只要在IE的右鍵菜單中選擇屬性,單擊「設置」按鈕,將Internet臨時文件夾中的「使用的磁碟空間」調大一些即可。
第三,在某些情況下, P4機器上安裝了主板驅動和其他驅動程序後再安裝office2000,在使用office2000時也有一定幾率會提示內存不足。這是由於P4主板驅動和office2000存在一些兼容性問題,可以嘗試備份數據後重新安裝操作系統,然後先安裝office2000,再安裝主板驅動等其他驅動程序,便可以較好的解決該問題。
第四,很常見的導致「內存不足」提示的原因是因為感染病毒。由於病毒在內存中大量復制,所以造成報錯提示。一般殺毒後即可解決該問題。
Ⅵ 如何釋放Python佔用的內存
在上文的優化中,對每500個用戶,會進行一些計算並記錄結果在磁碟文件中。原本以為這么做,這些結果就在磁碟文件中了,而不會再繼續佔用內存;但實際上,python的大坑就是Python不會自動清理這些內存。這是由其本身實現決定的。具體原因網上多有文章介紹,這里就不了。
本篇博客將貼一個筆者的實驗腳本,用以說明Python確實存在這么一個不釋放內存的現象,另外也提出一個解決方案,即:先del,再顯式調用gc.collect(). 腳本和具體效果見下。
實驗環境一:Win 7, Python 2.7
[python] view plain
from time import sleep, time
import gc
def mem(way=1):
print time()
for i in range(10000000):
if way == 1:
pass
else: # way 2, 3
del i
print time()
if way == 1 or way == 2:
pass
else: # way 3
gc.collect()
print time()
if __name__ == "__main__":
print "Test way 1: just pass"
mem(way=1)
sleep(20)
print "Test way 2: just del"
mem(way=2)
sleep(20)
print "Test way 3: del, and then gc.collect()"
mem(way=3)
sleep(20)
運行結果如下:
[plain] view plain
Test way 1: just pass
1426688589.47
1426688590.25
1426688590.25
Test way 2: just del
1426688610.25
1426688611.05
1426688611.05
Test way 3: del, and then gc.collect()
1426688631.05
1426688631.85
1426688631.95
對於way 1和way 2,結果是完全一樣的,程序內存消耗峰值是326772KB,在sleep 20秒時,內存實時消耗是244820KB;
對於way 3,程序內存消耗峰值同上,但是sleep時內存實時消耗就只有6336KB了。
實驗環境二: Ubuntu 14.10, Python 2.7.3
運行結果:
[plain] view plain
Test way 1: just pass
1426689577.46
1426689579.41
1426689579.41
Test way 2: just del
1426689599.43
1426689601.1
1426689601.1
Test way 3: del, and then gc.collect()
1426689621.12
1426689622.8
1426689623.11
[plain] view plain
ubuntu@my_machine:~$ ps -aux | grep test_mem
Warning: bad ps syntax, perhaps a bogus '-'? See
ubuntu 9122 10.0 6.0 270916 245564 pts/1 S+ 14:39 0:03 python test_mem.py
ubuntu 9134 0.0 0.0 8104 924 pts/2 S+ 14:40 0:00 grep --color=auto test_mem
ubuntu@my_machine:~$ ps -aux | grep test_mem
Warning: bad ps syntax, perhaps a bogus '-'? See
ubuntu 9122 10.0 6.0 270916 245564 pts/1 S+ 14:39 0:03 python test_mem.py
ubuntu 9134 0.0 0.0 8104 924 pts/2 S+ 14:40 0:00 grep --color=auto test_mem
ubuntu@my_machine:~$ ps -aux | grep test_mem
Warning: bad ps syntax, perhaps a bogus '-'? See
ubuntu 9122 11.6 0.1 30956 5608 pts/1 S+ 14:39 0:05 python test_mem.py
結論:
以上說明,當調用del時,其實Python並不會真正release內存,而是將其繼續放在其內存池中;只有在顯式調用gc.collect()時,才會真正release內存。
進一步:
其實回到上一篇博客的腳本中,也讓其引入gc.collect(),然後寫個監控腳本監測內存消耗情況:
[plain] view plain
while ((1)); do ps -aux | sort -n -k5,6 | grep my_script; free; sleep 5; done
結果發現:內存並不會在每500個用戶一組執行完後恢復,而是一直持續消耗到僅存約70MB時,gc才好像起作用。本環境中,機器使用的是Cloud instance,總內存2G,可用內存約為1G,本腳本內存常用消耗是900M - 1G。換句話說,對於這個腳本來說,gc並沒有立即起作用,而是在系統可用內存從1 - 1.2G下降到只剩70M左右時,gc才開始發揮作用。這點確實比較奇怪,不知道和該腳本是在Thread中使用的gc.collect()是否有關,或者是gc發揮作用原本就不是可控的。筆者尚未做相關實驗,可能在下篇博客中繼續探討。
但是,可以肯定的是,若不使用gc.collect(), 原腳本將會將系統內存耗盡而被殺死。這一點從syslog中可以明顯看出。