Арена рантайма не возвращает память, поэтому длинное вычисление упирается в ОЗУ раньше, чем во время
Про предел шагов известно давно. Про второй предел — нет, а он встречается ПЕРВЫМ на всяком долгом счёте: и толкователь, и напечатанный C держат значения в арене, которая не возвращает ничего. Память растёт линейно по числу шагов, и вычисление кончается не тем, что оно долгое, а тем, что оно не помещается.
Замеры 21 августа 2026, вывод ключа PBKDF2-HMAC-SHA256.
| чем считали | витков | что вышло |
|---|---|---|
толкователь (flang io плана входа) | 16 (≈70 сжатий блока) | 33 ГиБ за первую минуту, снят пределом 40 ГиБ, не досчитал |
| толкователь | 1 (≈18 сжатий, два счёта за прогон) | не влез в 40 ГиБ, прошёл под 90 ГиБ |
напечатанный C (emit --target c, -O2 -flto) | 8 000, ключ 32 байта | 55 с, пик 1,76 ГиБ |
| напечатанный C | 80 000, ключ 64 байта (вектор RFC 7914 §11) | ≈35 ГиБ по этой же пропорции |
Отсюда цена памяти у напечатанного C: около 56 КиБ на одно сжатие блока SHA-256. У толкователя — на два порядка больше.
Что из этого следует практически. Число витков вывода ключа у толкователя выбирается не «сколько не жалко подождать», а «сколько влезет в память». Штатные для PostgreSQL 4096 витков толкователю недоступны В ПРИНЦИПЕ, а не «долго»: это 16 384 сжатия, то есть сотни гигабайт. Поэтому у проверочной роли в examples/db/postgres-scram-plan.flang один виток, а согласие счёта с миром на штатных 4096 показано контрольным вектором RFC 7677 через напечатанный C, где то же самое стоит 154 с и умещается в память.
Как это выглядит, когда упрёшься. Толкователь под пределом группы — FLANG_MEMORY: недостаточно памяти. Без предела — процесс молча исчезает, а файл вывода остаётся пустым: первый прогон вектора на 80 000 витков шёл два часа и кончился именно так, в час, когда на машине оставалось 4,3 ГиБ свободных.
Чем ограничено. Это замер на одной машине и на одной задаче — счёте хеша над списками чисел. Пропорция «шаг → байты» у другой формы данных будет другой; верно то, что она НЕ УБЫВАЕТ по ходу счёта.
Связано: reference-vectors-beyond-the-step-limit-are-checked-in-emitted-c, the-interpreter-step-limit-decides-what-can-be-an-example, memory-per-category-is-regions
Поправка 24 августа 2026: арена возвращает — на откате области
Заголовок сказан слишком широко. Верно то, что fl_arena_reset и fl_arena_release за прогон почти не зовутся, и потому в flang io и в других командах без областей память по-прежнему растёт монотонно. Но у ОТКАТА ОБЛАСТИ (fl_arena_rollback) до 24 августа тоже не отдавалось ничего — и вот это оказалось поправимым почти даром: check types.flang --proof 6 236 536 → 3 974 552 КБ пика при том же времени.
Замер и разбор — arena-gives-chunks-back-on-rollback. Числа PBKDF2 выше сняты до этой правки и относятся к прогонам, где области нет.