1. 程式人生 > >python+multiprocess+theano+pylucene--記憶體洩露解決方案

python+multiprocess+theano+pylucene--記憶體洩露解決方案

最近上的專案有TPS要求,序列程式碼不滿足當前需求,需要改成多執行緒,就查了下Python的多執行緒,不查不知道,一查嚇一跳.

第一,Python是一種動態語言,我的理解是,執行到某一行的時候,才是知道編譯成機器碼,而不行C、JAVA等 靜態語言那樣事先編譯好再執行,這有一個顯著的問題:執行效率低

第二,Python有一個GIL,全稱,全域性直譯器鎖,為了解決多執行緒之間資料完整性和狀態同步的最簡單方法自然就是加鎖,就是因為這個超級大鎖的存在,某一個執行緒執行的時候,其他執行緒處於阻塞狀態,這將嚴重影響多執行緒執行效率,甚至可以認為Python就是個單執行緒的程式。有時候用多執行緒的解決方案甚至比序列程式碼還要慢。

第三,引入多執行緒之後,安裝的pylucene報錯:RuntimeError: attachCurrentThread() must be called first,大致意思是在啟動執行緒時候沒繫結執行緒,解決辦法如下:

vm_env = lucene.initVM(vmargs=['-Djava.awt.headless=true'])#啟動Lucene的時候新增
vm_env.attachCurrentThread()#繫結執行緒
vm_env.detachCurrentThread()#銷燬執行緒
沒發現問題,當壓力測試的時候,處理速度確實提升上去了,但發現一個問題:記憶體使用量只漲不消,執行4mins,程式崩潰,一步步查詢問題,一開始就認為是pylucene的原因,於是,通過gdb的方式,查詢問題,
sudo gdb python -p PIDS 

繫結程式執行緒

info threads

發現程式中有很多 [email protected]@XX 函式,這說明有鎖的情況存在,當程式完全跑完的時候,反饋,JVM的致命錯誤日誌(hs_err_pid.log)檔案,解讀發現一句:
# Problematic frame: 
# C  [_lucene.so+0x12ef5e2]  JCCEnv::callObjectMethod(_jobject*, _jmethodID*, ...) const+0xa2 
C:本地底層C錯誤,這更加印證了我們的猜想。這一次,我們將,程式碼中,pyLucene程式碼介面寫死,測試發現,程式碼記憶體基本保持不變,說明pylucene本身存在thread-safe問題,通過直接訪問知識圖譜庫,驗證實體。

第四,修改好之後,再測程式碼,再次發現問題:

 python2.7: /root/.theano/compiledir_Linux-4.10--generic-x86_64-with-Ubuntu-16.04-xenial-x86_64-2.7.12-64/tmphR0K8Y/mod.cpp:122: int {anonymous}::__struct_compiled_op_1b3927e45c5a4a2e8fa7da824d41d6af::run(): Assertion `PyArray_NDIM(V5) == 1' failed.  一查,發現,Theano is not thread-safe,

相關推薦

python+multiprocess+theano+pylucene--記憶體洩露解決方案

最近上的專案有TPS要求,序列程式碼不滿足當前需求,需要改成多執行緒,就查了下Python的多執行緒,不查不知道,一查嚇一跳. 第一,Python是一種動態語言,我的理解是,執行到某一行的時候,才是知道編譯成機器碼,而不行C、JAVA等 靜態語言那樣事先編譯好再執行,這有一

Android效能優化:手把手帶你全面瞭解 記憶體洩露 & 解決方案

前言 在Android中,記憶體洩露的現象十分常見;而記憶體洩露導致的後果會使得應用Crash 本文 全面介紹了記憶體洩露的本質、原因 & 解決方案,最終提供一些常見的記憶體洩露分析工具,希望你們會喜歡。 掃碼檢視公眾號: 目錄 1. 簡介 即 ML (

Python/Anaconda多版本共存的解決方案

mark一下,感謝作者分享! https://www.cnblogs.com/meelo/p/6034970.html Python/Anaconda多版本共存的解決方案 部落格中的文章均為 meelo 原創,請務必以連結形

Android中Handler造成記憶體洩露解決方法

Handler在建立時Android Lint會提示出警告: This Handler class should be static or leaks might occur 。

Ubuntu 18 安裝 Python 3.7 報錯的解決方案

Ubuntu 18 安裝 Python 3.7 報錯的解決方案 Ubuntu 18 安裝 Python 3.7 報錯的解決方案 0. 環境 1. sudo make install 報錯 ZipImportEr

常見的 Java 記憶體溢位解決方案

一、 java.lang.OutOfMemoryError: Java heap space —-JVM Heap(堆)溢位 JVM 在啟動的時候會自動設定 JVM Heap 的值,其初始空間(即-Xms)是實體記憶體的1/64,最大空間(-Xmx)不可超過實體記憶體。可以利用 JVM提

Jmeter報記憶體溢位解決方案

描述:wimdows環境,做上傳圖片介面測試,涉及圖片合成和上傳,圖片採用base64編碼。每1s啟動200執行緒的時候,Jmeter報記憶體溢位錯誤。 解決方案: 1、修改jmeter.bat: set HEAP=-Xms256m -Xmx256m 改為: se

Python自動化測試過程中出錯解決方案:retrying

最近發現的新的解決方案:retrying retrying是一個 Python的重試包,可以用來自動重試一些可能執行失敗的程式段。retrying提供一個裝飾器函式retry,被裝飾的函式就會在執行失敗的條件下重新執行,預設只要一直報錯就會不斷重試。 import random from retr

Python垃圾回收與記憶體洩露

    Python是面向物件、高階程式語言,其世界裡萬物皆物件,當我們編寫的程式執行時,程式碼中定義的物件在實體記憶體中會佔用相應的空間。現在流行的高階語言如Java,C#等都採用了垃圾收集機制自動管理記憶體使用,而不像C,C++需要使用者自己分配、釋放記憶體。自己管理記憶

Python環境搭建遇到問題及解決方案記錄

pip版本問題 環境使用Ubuntu16.04 , 安裝pip3 $sudo apt-get install python3-pip   預設安裝pip8.1.1,更新後是18.1 $pip3 install --upgrade pip   需要修改

swap記憶體不足解決方案 Torch: not enough memory: you tried to allocate 0GB. Buy new RAM!

執行lua程式時報錯: 此問題是由於記憶體不足引起的,可採用分配虛擬記憶體的方式進行解決。 解決方案: 1.首先用命令free檢視系統內 Swap 分割槽大小 free -m 可以

python安裝PIL失敗原因及解決方案

在windows下的虛擬環境安裝PIL: pip install PIL 出現報錯資訊: 原因: 經過查詢資料發現,python2可以使用pip install PIL安裝PIL第三方包。而我是使用的是python3,現在python3已經用Pillow代替PIL。

Java記憶體洩漏解決方案

記憶體洩露:     是指在程式執行過程中會不斷的分配記憶體空間,那些不再使用的記憶體空間應該即時回收它們,從而保證可以保證系統可以再次使用這些記憶體。如果存在無用的記憶體沒有被收回來,那就是記憶體洩露。  說明: 對於陣列的操作,堆和棧的操作需要慎重的考慮是否存在記憶體洩露

VUE SSR記憶體洩露解決過程和經驗總結

先上JS記憶體洩露的幾個常見原因 1.全域性變數引起的記憶體洩漏。2.閉包引起的記憶體洩漏.3.dom清空或刪除時,事件未清除導致的記憶體洩漏 node方面的記憶體洩露也基本差不多, 處理過程瞭解到的VUE方面的記憶體洩露的原因 1.計算屬性無返回情況下,導致的異常 vue高版本已修復.2.引用第三方

Tomcat記憶體洩露解決方法

環境: 今天早上,實施人員找我說,部署在tomcat上的一個專案總是間隔一段時間就自動關閉了,我詢問一些可能發生的情況後,我就找了tomcat下的日誌檔案catalina.2015-04-13.log,localhost.2015-04-13.log這兩檔案,經過一番查詢後

windows下python與anaconda的環境配置解決方案

背景:            跟隨老師做工程設計,新手入坑! 正文:      首先,下載Python3安裝包,我這裡下載的是Anaconda3,這是什麼東西呢?Anaconda3裡面集成了很多Python需要用到的第三方科學計算庫,後續使用中不像單獨的Python

[python]json.loads 幾種錯誤 解決方案

1、 json.loads Python錯誤: 'utf8' codec can't decode byte ... 由於需求,要用python讀取網頁返回json,並取得其中的資料但是卻遇到以上編碼的問題。 終於找到了解決方案: 我們只需要對字串進行unico

【騰訊開源】iOS爆記憶體問題解決方案-OOMDetector元件

元件介紹 OOMDetector是手Q自研的IOS記憶體監控元件,騰訊內部目前已有多個App接入了OOMDetector,它主要有以下兩個功能: 爆記憶體堆疊統計:負責記錄程序記憶體分配堆疊和記憶體塊大小,在爆記憶體時Dump堆疊資料到磁碟 記憶體洩漏檢測

Android 記憶體溢位解決方案 (整理)

<span style="font-size:14px;">在最近做的工程中發現載入的圖片太多或圖片過大時經常出現OOM問題,找網上資料也提供了很多方法,但自己感覺有點亂,特此,今天在不同型號的三款安卓手機上做了測試,因為有效果也有結果,今天小馬就做個詳細的總結

應用jacob元件造成的記憶體溢位解決方案(java.lang.OutOfMemoryError: Java heap space)

轉自(http://www.myexception.cn/ruby-rails/903889.html) 使用jacob元件造成的記憶體溢位解決方案(java.lang.OutOfMemoryError: Java heap space) 都說記憶體洩漏是C++的通病,記