Б
Size: a a a
Б
MK
E
Б
Б
PR
EM
Б
АП
MV
content
количество утекающей памяти увеличивается:def GetLanguage(path: str, content: bytes) -> str:
path_bytes = path.encode()
c_path_str = ffi.new("char[]", path_bytes)
go_path_str = ffi.new("_GoString_ *", [c_path_str, len(path_bytes)])
c_content_str = ffi.new("char[]", content)
go_content_str = ffi.new("GoSlice *", [c_content_str, len(content), len(content)])
go_out_str = lib.GetLanguage(go_path_str[0], go_content_str[0])
return ffi.unpack(go_out_str.p, go_out_str.n).decode()
_GoString_
и GoSlice
определены в либе следующим образом:typedef struct { const char *p; ptrdiff_t n; } _GoString_;
typedef _GoString_ GoString;
typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;
content
утекает где-то в районе go_content_str.
Но, как наисано в документации, ffi.new
освобождает память, как только соответствующая ему CData
разрушается питоновским gc. Насколько я понимаю питоновский gc, удаление CData должно происходить через какое-то время после вызова функции GetLanguage
. Но на деле, память остается аллоцированной на все время работы скрипта. Явный вызов gc.collect, также ничего не дает. Вопросов на самом деле несколько:E
p
content
количество утекающей памяти увеличивается:def GetLanguage(path: str, content: bytes) -> str:
path_bytes = path.encode()
c_path_str = ffi.new("char[]", path_bytes)
go_path_str = ffi.new("_GoString_ *", [c_path_str, len(path_bytes)])
c_content_str = ffi.new("char[]", content)
go_content_str = ffi.new("GoSlice *", [c_content_str, len(content), len(content)])
go_out_str = lib.GetLanguage(go_path_str[0], go_content_str[0])
return ffi.unpack(go_out_str.p, go_out_str.n).decode()
_GoString_
и GoSlice
определены в либе следующим образом:typedef struct { const char *p; ptrdiff_t n; } _GoString_;
typedef _GoString_ GoString;
typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;
content
утекает где-то в районе go_content_str.
Но, как наисано в документации, ffi.new
освобождает память, как только соответствующая ему CData
разрушается питоновским gc. Насколько я понимаю питоновский gc, удаление CData должно происходить через какое-то время после вызова функции GetLanguage
. Но на деле, память остается аллоцированной на все время работы скрипта. Явный вызов gc.collect, также ничего не дает. Вопросов на самом деле несколько:p
content
количество утекающей памяти увеличивается:def GetLanguage(path: str, content: bytes) -> str:
path_bytes = path.encode()
c_path_str = ffi.new("char[]", path_bytes)
go_path_str = ffi.new("_GoString_ *", [c_path_str, len(path_bytes)])
c_content_str = ffi.new("char[]", content)
go_content_str = ffi.new("GoSlice *", [c_content_str, len(content), len(content)])
go_out_str = lib.GetLanguage(go_path_str[0], go_content_str[0])
return ffi.unpack(go_out_str.p, go_out_str.n).decode()
_GoString_
и GoSlice
определены в либе следующим образом:typedef struct { const char *p; ptrdiff_t n; } _GoString_;
typedef _GoString_ GoString;
typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;
content
утекает где-то в районе go_content_str.
Но, как наисано в документации, ffi.new
освобождает память, как только соответствующая ему CData
разрушается питоновским gc. Насколько я понимаю питоновский gc, удаление CData должно происходить через какое-то время после вызова функции GetLanguage
. Но на деле, память остается аллоцированной на все время работы скрипта. Явный вызов gc.collect, также ничего не дает. Вопросов на самом деле несколько:MV
MV
void *
, а судя по доке p