我正在阅读Python内存管理,并希望减少我的应用程序的内存占用.有人建议,子程序在减轻问题方面会有很长的路要走; 但我无法概念化需要做什么.有人可以提供一个简单的例子来说明如何...
def my_function():
x = range(1000000)
y = copy.deepcopy(x)
del x
return y
@subprocess_witchcraft
def my_function_dispatcher(*args):
return my_function()
Run Code Online (Sandbox Code Playgroud)
...进入一个真正的子处理函数,不存储额外的"自由列表"?
这个"自由列表"概念是否也适用于python c-extensions?
我有TensorFlow的内存泄漏.我提到Tensorflow:即使在关闭Session时内存泄漏?为了解决我的问题,我按照答案的建议,似乎解决了这个问题.但它在这里不起作用.
为了重新创建内存泄漏,我创建了一个简单的例子.首先,我使用这个函数(我在这里:如何在Python中获取当前的CPU和RAM使用?)来检查python进程的内存使用情况:
def memory():
import os
import psutil
pid = os.getpid()
py = psutil.Process(pid)
memoryUse = py.memory_info()[0]/2.**30 # memory use in GB...I think
print('memory use:', memoryUse)
Run Code Online (Sandbox Code Playgroud)
然后,每次调用该build_model函数时,内存的使用都会增加.
这是build_model具有内存泄漏的函数:
def build_model():
'''Model'''
tf.reset_default_graph()
with tf.Graph().as_default(), tf.Session() as sess:
tf.contrib.keras.backend.set_session(sess)
labels = tf.placeholder(tf.float32, shape=(None, 1))
input = tf.placeholder(tf.float32, shape=(None, 1))
x = tf.contrib.keras.layers.Dense(30, activation='relu', name='dense1')(input)
x1 = tf.contrib.keras.layers.Dropout(0.5)(x)
x2 = tf.contrib.keras.layers.Dense(30, activation='relu', name='dense2')(x1)
y = tf.contrib.keras.layers.Dense(1, activation='sigmoid', name='dense3')(x2)
loss = tf.reduce_mean(tf.contrib.keras.losses.binary_crossentropy(labels, y))
train_step = …Run Code Online (Sandbox Code Playgroud) 我试图拆分循环即
N = 1000000
for i in xrange(N):
#do something
Run Code Online (Sandbox Code Playgroud)
使用multiprocessing.Process并且它适用于N的小值.当我使用更大的N值时会出现问题.在p.join()之前或期间发生奇怪的事情并且程序没有响应.如果我把print i,而不是q.put(i)放在函数f的定义中,一切都运行良好.
我将不胜感激任何帮助.这是代码.
from multiprocessing import Process, Queue
def f(q,nMin, nMax): # function for multiprocessing
for i in xrange(nMin,nMax):
q.put(i)
if __name__ == '__main__':
nEntries = 1000000
nCpu = 10
nEventsPerCpu = nEntries/nCpu
processes = []
q = Queue()
for i in xrange(nCpu):
processes.append( Process( target=f, args=(q,i*nEventsPerCpu,(i+1)*nEventsPerCpu) ) )
for p in processes:
p.start()
for p in processes:
p.join()
print q.qsize()
Run Code Online (Sandbox Code Playgroud)