在for循环中,我遇到了从C++调用Python函数的麻烦。C++程序生成一张图片,Python脚本将其转换为调整大小的jpeg图像。
来自C++的调用片段:
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脚本:
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 outfilePython文件的名称是Test.py。它可以运行3-4个小时(它不会一步一步地变慢)。那么我认为PyImport_Import()运行得很慢。
如果我再次启动cpp程序,它将正常运行,但过了一段时间后会越来越慢。
内存使用量大约是大小的一半(8 3GB中的3 3GB)。CPU使用率约为30%。
有什么想法吗?
发布于 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
https://stackoverflow.com/questions/69859873
复制相似问题