tensorflow記憶體溢位問題

2021-09-07 20:30:20 字數 856 閱讀 1778

tensorflow的靜態圖結構簡潔清晰,符合人的思維。雖然程式設計上略微有些複雜,但是原理很容易看懂。

tensorflow分建圖過程和執行圖(張量求值)兩個階段,在這兩個階段中都可以定義操作和張量。但是有乙個非常容易犯的錯誤:把操作定義在迴圈裡面。

例如下面這個例子,tf.assign操作放在了迴圈裡面。

import tensorflow as tf

x = tf.variable(1.0, dtype=tf.float32)

with tf.session()as sess:

sess.run(tf.global_variables_initializer())

for i in range(int(5)):

ass = tf.assign(x, 2.0)

sess.run(ass)

del ass # del操作不會刪除ass這個操作結點,只是刪除了記憶體中的引用

print(tf.get_default_graph().get_operations())#檢視圖中的所有操作

print(tf.get_default_graph().get_operations())#session結束了但是session中開闢的變數也沒有**

在此例中,大量的「操作結點」被新增到圖中,開啟任務管理器查詢python程序,可以發現記憶體一直在漲,原因就在於申請了大量的「tf.add」操作結點卻無法釋放。

這個問題如何避免呢?只需要把操作結點的定義放在迴圈外面就可以了。

舉乙個錯誤的例子,我們在計算accuracy時,如果把accuracy的操作結點定義在迴圈內部,那麼隨著訓練批次的不斷增加,會產生大量的操作結點,訓練一段時間之後,記憶體就溢位了。

Spring整合Shiro時記憶體溢位的問題分析

前段時間有一天系統訪問量突然增加,系統每隔一兩個小時就會由於記憶體瞬時飆公升而宕機。檢視記憶體dump檔案發現其中shiro的 session物件異常多 後來經分析才發現是由於使用spring整合shiro時配置不當導致的。當時的配置如下 sessionmanager class org.apach...

棧溢位,記憶體溢位

對於一台伺服器而言,每乙個使用者請求,都會產生乙個執行緒來處理這個請求,每乙個執行緒對應著乙個棧,棧會分配記憶體,此時如果請求過多,這時候記憶體不夠了,就會發生棧記憶體溢位。棧溢位是指不斷的呼叫方法,不斷的壓棧,最終超出了棧允許的棧深度,就會發生棧溢位,比如遞迴操作沒有終止,死迴圈。可以把記憶體比作...

linux 記憶體溢位排查 mysql記憶體溢位處理

業務場景 mysql 元件版本 mysql 5.7.25軟體架構 兩主兩從 01問題描述 mysql是乙個關係型資料庫管理系統,屬於oracle旗下產品。mysql是最流行的關係型資料庫管理系統之一,在web應用方面,mysql是最好的rdbms relational database manage...