python - 如何控制多线程中的内存使用?

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

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

在我有足够内存的电脑上运行良好(处理很多图像时增加2~3GB),但我的服务器只有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")

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

最佳答案

我认为您从错误的角度看待这个问题。您的代码启动了 n 个线程。这些线程然后执行您为它们定义的工作

如果这项工作需要他们分配大量内存 - 该上下文“外部”的任何东西应该对此做什么?应该发生什么?一些线程应该被杀死吗?是否应该在某个地方,在 C 代码的深处编写一个 malloc ... 不发生 ... 然后呢?

我的意思是:您的问题很可能是因为您只是启动了太多的线程。

因此答案是:你破坏了它们之后不要尝试修复它们 - 最好确保你根本没有破坏它们:

  • 仔分割析,以理解您的应用;这样您就可以评估单个线程完成其“工作”需要多少内存
  • 然后更改您的“主”程序以查询它正在运行的硬件(例如:检查可用内存和可用物理 CPU 的数量)
  • 并根据该评估,在给定上述硬件详细信息的情况下启动应该工作的线程数

除此之外:这是非常常见的模式。开发人员有一台他正在使用的“强大”机器;并且他隐含地假设运行他的产品的任何目标系统都将具有相同或更好的特性。这根本不是真的。

换句话说:当您不知道硬件看起来如何运行您的代码时 - 那么只有一个合理的事情要做:首先获取该知识。之后根据真实数据做不同的事情。

关于python - 如何控制多线程中的内存使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44966704/

相关文章:

python - 在 Python 中使用 os.stat() 结果时如何忽略隐藏文件?

javascript - Python - 使用请求模块重建 Javascript 生成的代码

python - 如何让 Maven 与 Python 子进程一起工作?

用于休眠函数的 Python C 扩展

C++11 线程 - 从类内部启动无限工作线程

java - 在 !.isTermminate 循环内添加 Thread.sleep 可以吗?

c# - 如何创建周期性任务

c# - 用于人员检测的 Emgu 训练 SVM - C#

python - 从图像标签创建边界框

java - PNG用Java读写会增加文件大小