Thursday, October 6, 2016

фрагментация кучи


изображение иллюстрирует как я срочно чиню сломанный билд.

я тут наступил на багу с удалением памяти.
вот программа, в программу приходит по 4 гигабайта данных раз в минуту. т.е. приблизительно 4 гигантских таких картинки 10000х25000 числами одинарной точности. умные учоные хранят эти данные в виде приблизительно такой структуры
vector< vector<float> *> image;
там звездочка, это важно.
и до недавнего времени я заранее выделял все эти сорок тысяч массивов, какого нужно размера (потенциально разного), и жил с ними неделями, все работает, данные приходят, обрабатываются, сохраняются. а если геологи на передающей стороне АЦП подкрутили и теперь стали приходить внезапно кусоки другого размера, то я удаляю всю эту конструкцию последовательно и создаю заново, ровненько по нужным размерам, что бы не заморачиваться там в недрах с кодом, написанным 30 лет назад.

выделение быстро происходит, меньше секунды. а вот с удалением вышел сюрприз: первый раз этот балаган удаляется за одну секунду, а второй раз за 42 секунды уже; а третьего раза я не дождался; проверил на своем ноуте - повторное удаление уже 200 секунд.
виндовс7, рантайм - вижуал студия 2012.
вот это вот фрагментация кучи такая удивительная, да?
причем я подобное наблюдал уже и фиксил, при каждом приеме перевыделение одного гигабайта приводило к деградации по скорости. то есть где-то за день оно уже переставало успевать обрабатывать весь этот шум. то есть с 4 секунд до 60 время вырастало.
конец истории.
щас зарелизимся и я наверное наберусь смелости выкину всю эту ебалу, заменю на цельный кусок памяти размером с 4гб и пыщпыщ.
эй, бывшие коллеги, добавьте меня в свой слак, я вам интересного расскажу, бгг.