我正在使用多线程来处理图像。
它在我的计算机上工作正常,有足够的内存(处理许多图像时增加2~3 GB),但我的服务器只有1GB内存,代码无法正常工作。
有时会以Segmentation fault
结尾,有时会:
Exception in thread Thread-13:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner
self.run()
File "/usr/lib/python2.7/threading.py", line 763, in run
self.__target(*self.__args, **self.__kwargs)
File "passportRecognizeNew.py", line 267, in doSomething
...
代码:
import threading
def doSomething(image):
# picture processing code
print("processing over")
threads = []
for i in range(20):
thread = threading.Thread(target=doSomething, args=("image",))
threads.append(thread)
for t in threads:
t.setDaemon(True)
t.start()
t.join()
print("All over")
如何解决这个或以任何方式控制内存使用?
答案 0 :(得分:2)
我认为你是从错误的角度看待这个问题。您的代码会激活 n 个线程。然后,这些线程执行您为它们定义的 work 。
如果这项工作要求他们分配大量内存 - 什么都应该"外面"该背景有关于此吗?应该怎么办?是否应该杀死一些线程?应该在某个地方,在C代码的深处malloc
......不会发生......然后呢?
我所说的是:您的问题很可能是,您只是在激活太多这些线程。
因此,答案是:在打破它们之后不要尝试修复 - 更好地确保你根本不打破它们:
除此之外:这是非常常见的模式。开发人员有一个强大的"他正在研究的机器;他隐含地假设任何运行其产品的目标系统都具有相同或更好的特征。这根本不是真的。
换句话说:当你不知道你的代码是如何运行时 - 那么只有一个合理的事情要做:首先获得这些知识。然后根据实际数据做不同的事情。
答案 1 :(得分:2)
使用GhostCat帮助,我使用以下代码来解决内存使用问题。
details
我使用psutil模块获取可用内存。
参考代码:yosemitebandit/ibm_queue.py
我的问题中的代码存在创建超过summary
的线程的问题。