我有一个从python调用的c-dll。 dll的输出很大,我怀疑这会导致错误
OSError: exception: stack overflow
我很确定问题出在输出的大小(大约是4x25x720的两倍)。减小输出大小(我不想这样做)会使错误消失。
在C#中,我可以通过为调用线程分配更多的内存来解决此问题,即>]
thread = new Thread(() => calculate(ptr_in, ptr_out), 20000000);
是否可以用
ctypes
做类似的事情?
这不是这里发布的问题Ctypes: OSError: exception: stack overflow。
考虑问题,我认为问题不在于输出的大小,而是实际dll本身所需的空间。即ctypes_test.c中定义的c_out inner_out
。无论如何,问题仍然相同。
在C中,我定义一个测试dll dll_ctypes_test
ctypes_testT.h
#pragma once #define N_ELEMENTS 1000 #define N_ARRAYS 50 typedef struct { double var_0; double var_1; double var_2; double var_3; double var_4; double var_5; double var_6; double var_7; double var_8; double var_9; } element; typedef struct { int n_elements; element elements[N_ELEMENTS]; } arr; typedef struct { int n_arrays; arr arrays[N_ARRAYS]; } c_out;
ctypes_test.c
#include "ctypes_testT.h" __declspec(dllexport) void _stdcall dll_ctypes_test(double in, c_out *out) { c_out inner_out; //Some caluclations on inner_out //Wrap values of inner arr to out }
和Python代码
import ctypes N_ELEMENTS = 1000 N_ARRAYS = 50 class element(ctypes.Structure): _fields_ = [('var_0', ctypes.c_double), ('var_1', ctypes.c_double), ('var_2', ctypes.c_double), ('var_3', ctypes.c_double), ('var_4', ctypes.c_double), ('var_5', ctypes.c_double), ('var_6', ctypes.c_double), ('var_7', ctypes.c_double), ('var_8', ctypes.c_double), ('var_9', ctypes.c_double)] class arr(ctypes.Structure): _fields_ = [('n_elements', ctypes.c_int), ('elements', element * N_ELEMENTS)] class c_out(ctypes.Structure): _fields_ = [('n_arrays', ctypes.c_int), ('arrays', arr * N_ARRAYS)] dll = ctypes.WinDLL(r'C:\repos\ctypes_test\x64\Debug\ctypes_test.dll') dll.dll_ctypes_test.argtypes = [ctypes.c_double, ctypes.POINTER(c_out)] dll.dll_ctypes_test.restype = None dll.dll_ctypes_test(5, ctypes.byref(c_out()))
调用Python代码产生
Traceback (most recent call last): File "<ipython-input-15-7c8b287888d0>", line 1, in <module> dll.dll_ctypes_test(5, c_out()) OSError: exception: access violation writing 0x00000062BA400000
如果我将
N_ARRAYS
从50
更改为10
。错误消失了。
我有一个从python调用的c-dll。 dll的输出很大,我怀疑这会导致错误OSError:异常:堆栈溢出我很确定问题是输出的大小(...