Size: a a a

2020 September 23

Б

Боброний in PiterPy Meetup
Боброний
Свершилос.
источник

MK

Maxim Koltsov in PiterPy Meetup
Нифига себе
источник

E

Eugene in PiterPy Meetup
Они будут этот плагин брать под крыло JetBrains? Или он так и останется неофициальным?

Мне кажется, в issue за эту фичу 500 звёздочек точно скоро наберется. :)
источник

Б

Боброний in PiterPy Meetup
Eugene
Они будут этот плагин брать под крыло JetBrains? Или он так и останется неофициальным?

Мне кажется, в issue за эту фичу 500 звёздочек точно скоро наберется. :)
Я так понял, что JB запилили полноценное API для подобных плагинов
источник

Б

Боброний in PiterPy Meetup
Имхо, так даже лучше
источник
2020 September 24

Б

Боброний in PiterPy Meetup
источник

S

Stan in PiterPy Meetup
источник

DB

Dima Boger in PiterPy Meetup
Любимый сайт...
источник

Б

Боброний in PiterPy Meetup
источник

PR

Paul Rudnitskiy in PiterPy Meetup
Dima Boger
Любимый сайт...
отличный сайт на самом деле.
источник

EM

Egor Molodik in PiterPy Meetup
Чего-то в голос
источник
2020 September 25

Б

Боброний in PiterPy Meetup
Это же какой-то скам, верно?
источник

АП

Алексей А́риксу Петр... in PiterPy Meetup
Боброний
Это же какой-то скам, верно?
Это какой-то бот плохо протестили
источник

MV

Maxim Vasilev in PiterPy Meetup
Всем привет! А кто-нибудь из присутствующих здесь пользовался cffi? Есть вот такой кусок кода, который течет по памяти, причем с увеличением размера 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, также ничего не дает. Вопросов на самом деле несколько:
1. Я где-то ошибаюсь? (помимо попыток использования cffi в питоне)
2. Есть ли какие-то адекватные способы это дебажить?
источник
2020 September 26

E

Eugene in PiterPy Meetup
источник

p

pragus in PiterPy Meetup
Maxim Vasilev
Всем привет! А кто-нибудь из присутствующих здесь пользовался cffi? Есть вот такой кусок кода, который течет по памяти, причем с увеличением размера 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, также ничего не дает. Вопросов на самом деле несколько:
1. Я где-то ошибаюсь? (помимо попыток использования cffi в питоне)
2. Есть ли какие-то адекватные способы это дебажить?
Я
источник

p

pragus in PiterPy Meetup
Maxim Vasilev
Всем привет! А кто-нибудь из присутствующих здесь пользовался cffi? Есть вот такой кусок кода, который течет по памяти, причем с увеличением размера 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, также ничего не дает. Вопросов на самом деле несколько:
1. Я где-то ошибаюсь? (помимо попыток использования cffi в питоне)
2. Есть ли какие-то адекватные способы это дебажить?
А зачем вам аллокация под контент?
источник

MV

Maxim Vasilev in PiterPy Meetup
pragus
А зачем вам аллокация под контент?
А байты можно прямо так в поле структуры положить?
источник

MV

Maxim Vasilev in PiterPy Meetup
Хммм… Видимо нельзя, потому что поле таки void *, а судя по доке

> So when you call such a function, you can pass an argument that is accepted by either C type, like for example passing a Python string to a char * argument
источник

p

pragus in PiterPy Meetup
Maxim Vasilev
А байты можно прямо так в поле структуры положить?
Buffer api же
источник