如何在多线程中控制内存使用?

时间:2017-07-07 09:01:10

标签: python multithreading image-processing memory-management out-of-memory

我正在使用多线程来处理图像。

它在我的计算机上工作正常,有足够的内存(处理许多图像时增加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")

如何解决这个或以任何方式控制内存使用?

2 个答案:

答案 0 :(得分:2)

我认为你是从错误的角度看待这个问题。您的代码会激活 n 个线程。然后,这些线程执行您为它们定义的 work

如果这项工作要求他们分配大量内存 - 什么都应该"外面"该背景有关于此吗?应该怎么办?是否应该杀死一些线程?应该在某个地方,在C代码的深处malloc ......不会发生......然后呢?

我所说的是:您的问题很可能是,您只是在激活太多这些线程。

因此,答案是:在打破它们之后不要尝试修复 - 更好地确保你根本不打破它们:

  • 仔细分析,了解您的应用程序;因此,您可以评估单个线程需要多少内存才能使其工作"完成
  • 然后改变你的" main"用于查询正在运行的硬件的程序(例如:检查可用内存和可用的物理CPU数量)
  • 并根据该评估,在给定上述硬件详细信息的情况下,启动工作的线程数

除此之外:这是非常常见的模式。开发人员有一个强大的"他正在研究的机器;他隐含地假设任何运行其产品的目标系统都具有相同或更好的特征。这根本不是真的。

换句话说:当你不知道你的代码是如何运行时 - 那么只有一个合理的事情要做:首先获得这些知识。然后根据实际数据做不同的事情。

答案 1 :(得分:2)

使用GhostCat帮助,我使用以下代码来解决内存使用问题。

details

我使用psutil模块获取可用内存。

参考代码:yosemitebandit/ibm_queue.py

我的问题中的代码存在创建超过summary的线程的问题。