首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从C++调用循环中的Python函数数小时后运行缓慢

从C++调用循环中的Python函数数小时后运行缓慢
EN

Stack Overflow用户
提问于 2021-11-05 22:29:16
回答 1查看 59关注 0票数 1

在for循环中,我遇到了从C++调用Python函数的麻烦。C++程序生成一张图片,Python脚本将其转换为调整大小的jpeg图像。

来自C++的调用片段:

代码语言:javascript
复制
char *antwort;                              
// Python
PyObject *fname, *module, *pFunc, *pArgs, *pValue;
Py_Initialize();
PyObject* fname = PyUnicode_FromString((char*)"TEST");
PyObject* module = PyImport_Import(fname);
printf("OK -> ");
pFunc = PyObject_GetAttrString(module, (char*)"umwandeln");
pArgs = PyTuple_Pack(1, PyUnicode_FromString((char*)filename));
pValue = PyObject_CallObject(pFunc, pArgs);
auto result = _PyUnicode_AsString(pValue);


antwort = result;                           
Py_DECREF(pFunc);
Py_DECREF(module);
Py_DECREF(fname);
Py_DECREF(pArgs);
Py_DECREF(
Py_Finalize();

Python脚本:

代码语言:javascript
复制
import sys
import os
import gc
from PIL import Image

def umwandeln(filenam):
    Test = str(filenam)
    Test = Test[2:]
    print ("file : " + Test)
    if Test[-3:] == "tif" or Test[-3:] == "bmp" :
       # print "is tif or bmp"
       outfile = Test[:-3] + "jpeg"
       im = Image.open(Test)
       print ("new filename : " + outfile)
       out = im.convert("RGB")

            
       out.save(outfile, "JPEG", quality=95)
       im.close()
      # print(outfile)
       im2 = Image.open(outfile)
       im2 = im2.resize((300,300),Image.ANTIALIAS)
       im2.save(outfile)
       im2.close()


       os.remove(Test)
       print ("Fertig Script")  
       gc.collect()
       
    
    return outfile

Python文件的名称是Test.py。它可以运行3-4个小时(它不会一步一步地变慢)。那么我认为PyImport_Import()运行得很慢。

如果我再次启动cpp程序,它将正常运行,但过了一段时间后会越来越慢。

内存使用量大约是大小的一半(8 3GB中的3 3GB)。CPU使用率约为30%。

有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2021-11-09 22:30:32

这听起来像是随着时间的推移内存碎片的问题。您始终在同一进程中运行,在每次python调用中创建/销毁至少5个对象(更不用说在umwandeln()中调用的python函数中可能要高得多的数字)。

您可以尝试使umwandeln()中的一些变量成为静态变量,这样就不需要在每次调用时都分配/释放它们。

另一种方法是将umwandeln()函数分解为单独的python脚本,将文件名添加为脚本参数。然后,直接从C++或使用Python子流程模块(https://docs.python.org/3/library/subprocess.html)调用脚本,就好像它是一个外部程序(它确实是外部程序)。这样做还意味着您可以通过多次为不同的文件名调用外部脚本来并行调整图像的大小。

这是我用于图像预处理/后处理的方法之一,我可以很高兴地报告,我在24核(Threadripper) Linux PC上达到了远高于250的负载因子,它吐出的图像就像没有明天一样。

/N

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69859873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档