Size: a a a

2020 March 05

GD

Grigory Dobrov in pro.cxx
x32 ?
источник

M

Mikhail in pro.cxx
Grigory Dobrov
x32 ?
да
источник

GD

Grigory Dobrov in pro.cxx
если выделяется какой-нибудь вектор или массив, то ему нужно непрерывное адресное пространство. Поэтому если утекли копейки, но разбили пространство пополам, то больше вы его выделить не сможете и будете получать bad_alloc, хотя по диспетчеру задач память вернется
источник

M

Mikhail in pro.cxx
Grigory Dobrov
если выделяется какой-нибудь вектор или массив, то ему нужно непрерывное адресное пространство. Поэтому если утекли копейки, но разбили пространство пополам, то больше вы его выделить не сможете и будете получать bad_alloc, хотя по диспетчеру задач память вернется
Да, интересная мысль
источник

M

Mikhail in pro.cxx
Но выдялется именно вектор чаров и удаляется тоже
источник

CD

Constantine Drozdov in pro.cxx
Mikhail
Всем привет! Столкнулся со следующей проблемой. У меня есть сервер, который принимает запросы, протокол не важен. Тест кейс такой:
1. Формирую большой запрос, для которого у сервиса хватит памяти чтобы обработать, получаю валидный результат.
2. Формирую большой запрос, для которого у сервиса точно не хватит памяти, чтобы обработать - получаю bad allocation
3. Снова формирую такой же запрос, как и на первом шаге - получаю bad allocation
4. Формирую большой запрос, но меньше чем в первом шаге - получаю валидный ответ.
5. До перезапуска сервиса, все запросы, такого же размера, как в первом шаге возвращают bad allocation.

В связи с этим, несколько вопросов:
1. Возможно ли такое поведение из-за выделения памяти ОС? После bad allocation что-то случается с фрагментацией памяти, и я не могу уже выделять такие большие области как прежде?
2. Поведение замечено на WIndows. Есть ли какие то особенности для этой ОС с хэндлом bad allocation исключения?

Спасибо за внимание!
в х32 вы не решите эту проблему никогда
источник

CD

Constantine Drozdov in pro.cxx
Mikhail
Но выдялется именно вектор чаров и удаляется тоже
Если произошла любая аллокация статической переменной или что-то подобное, все фрагментировалось
На практике выделение последовательного блока более 60М на х32 при длительной работе можно считать ненадежным
источник

M

Mikhail in pro.cxx
Constantine Drozdov
в х32 вы не решите эту проблему никогда
Какую именно? Что после bad allocation не могу отправить те же данные, что до этого обрабатывались?
источник

M

Mikhail in pro.cxx
Constantine Drozdov
Если произошла любая аллокация статической переменной или что-то подобное, все фрагментировалось
На практике выделение последовательного блока более 60М на х32 при длительной работе можно считать ненадежным
Интересно, а где про это можно узнать?
источник

m

magras in pro.cxx
На самом деле это может решаться довольно легко с помощью кастомных аллокаторов и отдельного хипа под запрос. Я так лечил подобную проблему. Но протаскивать алокаторы может оказаться неприятным экспириенсом.
источник

CD

Constantine Drozdov in pro.cxx
Mikhail
Интересно, а где про это можно узнать?
Проводить с этим эксперименты
источник

m

magras in pro.cxx
magras
На самом деле это может решаться довольно легко с помощью кастомных аллокаторов и отдельного хипа под запрос. Я так лечил подобную проблему. Но протаскивать алокаторы может оказаться неприятным экспириенсом.
Но на самом деле гораздо лучше просто перейти на х64.
источник

CD

Constantine Drozdov in pro.cxx
magras
На самом деле это может решаться довольно легко с помощью кастомных аллокаторов и отдельного хипа под запрос. Я так лечил подобную проблему. Но протаскивать алокаторы может оказаться неприятным экспириенсом.
Единственный путь в 32 - изолированная аллокация и полное освобождение данных (т. е. абсолютно никаких кешей между запросами), да
источник

CD

Constantine Drozdov in pro.cxx
На практике проще даже избегать длинных аллокаций
источник

m

magras in pro.cxx
Constantine Drozdov
Единственный путь в 32 - изолированная аллокация и полное освобождение данных (т. е. абсолютно никаких кешей между запросами), да
Достаточно только самые большие куски на отдельной куче аллоцировать.
источник

CD

Constantine Drozdov in pro.cxx
magras
Достаточно только самые большие куски на отдельной куче аллоцировать.
Мне кажется, проще не аллоцировать больше 1М последовательного блока :)
источник

IA

Ivan Azoyan in pro.cxx
Какой вы используете подход, если вам нужно отменить boost::steady_timer. Дело в том, что у меня происходит data race при cancel(). Таймер крутится на io_context'e в другом потоке
источник

CD

Constantine Drozdov in pro.cxx
magras
Достаточно только самые большие куски на отдельной куче аллоцировать.
Могу сказать от себя, что мы конкретно задолбались с использованием диска как того-самого-аллокатора, пока нельзя было на 64 глобально перейти
источник

ПК

Побитый Кирпич in pro.cxx
Ivan Azoyan
Какой вы используете подход, если вам нужно отменить boost::steady_timer. Дело в том, что у меня происходит data race при cancel(). Таймер крутится на io_context'e в другом потоке
Ну дак херани мутекс
источник

IA

Ivan Azoyan in pro.cxx
Побитый Кирпич
Ну дак херани мутекс
До m_timer.cancel()?  не помогает. Я думаю, может как-то подход вообще пересмотреть
источник