June 4th, 2018

404

Зона комфорта

Выход за зону комфорта позволяет выучить новое. Иногда выглядывать за зону комфорта полезно, даже в середине работы.

Но...

Основная часть работы по созданию чего-либо должна проходить в зоне комфорта. Когда всё знаешь, всё умеешь, всё понимаешь. Если создаёшь что-то вне зоны комфорта — это же учебный проект. Поиграться и бросить. Хороший качественный софт (архитектура, etc) может быть создана только в зоне комфорта создателя.

Одной из целей самообучения как раз и является создание такой зоны комфорта, чтобы она была полезной. Но не надо путать процесс «оттаптывания» зоны комфорта и рабочий процесс. Хороший инженер, занимаясь созданием, должен быть на 99.9% в зоне комфорта. В процессе отладки может оказаться, что из этой зоны надо выйти — но вот процесс создания должен быть комфортным, а не исследовательским.


404

Продолжение мистики с питоном

Точнее, разрешение мистики.

Моя главная загадка — с адресами питоновы объектов вне /proc/self/maps разрешилась просто:

1. Cpython действительно использует адрес как id. Всегда.

2. 'x' в GDB позволяет посмотреть объект в адресном пространстве отлаживаемого процесса.

3. Но! Всё, что выполняется с 'python' в gdb, исполняется в адресном пространстве gdb. Т.е. к отлаживаемому процессу никак не относится.

4. gc — плохой метод получать список объектов. Все иммутабельные объекты в gc.get_objects() просто отсутствуют. Например, все строки. Все tuple'ы иммутабельных объектов, и т.д. Более того, мутабельные контейнеры (списки, словари, множества) состоящие только из иммутабельных объектов, в выводе gc отсутствуют.

Я разрешил все WTF, которые у меня возникли в процессе, но саму загадку я не разрешил.

На самом деле, я так и не научился делать инспекцию heap'а и/или списка питоновых объектов по core dump. Если кто умеет — подскажите.

Upd: Я написал proof of concept фрагментатора памяти питона. После выполнения объекты занимают в памяти примерно 300Мб, а сам питон — 3.6Гб, как на пике потребления (до удаления больших объектов).

Рекламирующим pypy, сравните, пожалуйста. Надо запустить и посмотреть (не прибивая) сколько там в top'е RES сожрал.

Upd2: Уточнение: питон начинает отдавать память в ОС при размере удаляемого объекта от 128кб.