Б
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