Доброго времени суток! Дабы не заплесневеть, решил сделать на Си динамический массив типа std::vector. Все работает, я доволен, но не могу выделить больше ~800Кб памяти (на самом деле в 4 раза больше с учетом дополнительного буфера). Пишет Not enough space. Читал форумы, говорят, что malloc умеет выделять память только подряд или вроде того, а подряд может не быть. Как же тогда же делить 10 Мб, если нужно? делать список вместо массива? Или я чего-то не понимаю?
Спасибо!
Здравствуйте, plastictown, Вы писали:
P>Доброго времени суток! Дабы не заплесневеть, решил сделать на Си динамический массив типа std::vector. Все работает, я доволен, но не могу выделить больше ~800Кб памяти (на самом деле в 4 раза больше с учетом дополнительного буфера). Пишет Not enough space. Читал форумы, говорят, что malloc умеет выделять память только подряд или вроде того, а подряд может не быть. Как же тогда же делить 10 Мб, если нужно? делать список вместо массива? Или я чего-то не понимаю? P>Спасибо!
А под какую платформы вы пишите?
Здравствуйте, kov_serg, Вы писали: _>А под какую платформы вы пишите?
Под виндой x64 получается не больше ~200000 штук uint32_t, под Linux x64 (Mint) на ~45000 говорит "невозможно выделить память". gcc на обеих платформах. свободной памяти несколько гигабайт.
Здравствуйте, plastictown, Вы писали:
P>Доброго времени суток! Дабы не заплесневеть, решил сделать на Си динамический массив типа std::vector. Все работает, я доволен, но не могу выделить больше ~800Кб памяти (на самом деле в 4 раза больше с учетом дополнительного буфера). Пишет Not enough space. Читал форумы, говорят, что malloc умеет выделять память только подряд или вроде того, а подряд может не быть. Как же тогда же делить 10 Мб, если нужно? делать список вместо массива? Или я чего-то не понимаю?
наиболее вероятные причины:
1. у тебя косяк в коде.
2. у тебя косяк в коде.
3. у тебя косяк в коде.
...
100. проблемы с железом.
101. косяк в стандартной либе.
По делу. Без кода, без подробностей (компилятор, его ключи, платформа и т.п.) никто Вам не поможет. Ваш случай уникальный — миллионы людей по всему миру вот уже более 40 лет пользуются malloc. Десятки тысяч коммерческих продуктов работают и "выгребают" всю возможную память из системы. А тут жалкие 800Кб...
Здравствуйте, plastictown, Вы писали:
P>Доброго времени суток! Дабы не заплесневеть, решил сделать на Си динамический массив типа std::vector. Все работает, я доволен, но не могу выделить больше ~800Кб памяти (на самом деле в 4 раза больше с учетом дополнительного буфера). Пишет Not enough space. Читал форумы, говорят, что malloc умеет выделять память только подряд или вроде того, а подряд может не быть. Как же тогда же делить 10 Мб, если нужно? делать список вместо массива? Или я чего-то не понимаю?
1. Одно из требований стандарта к std::vector — это чтобы все его элементы располагались в непрерывной области памяти. Поэтому если сделать список вместо массива, это уже будет существенно отличаться от std::vector.
2. Просто, что бы убедиться, что проблема именно в malloc, попробуй создать приложение в котором не будет ничего, кроме одиночного выделения памяти с помощью malloc. Если проблема при этом исчезнет, то ищи ошибку в своем коде.
--
Не можешь достичь желаемого — пожелай достигнутого.
SaZ>Да зачем так далеко: https://rsdn.org/Info/Howtoask.xml
Каюсь, не читал... В свое оправдание — на SE действительно отправляют читать новичков по этим ссылкам. У нас не припомню. Да и наш текст более длинный...
Здравствуйте, const_volatile, Вы писали:
_>Здравствуйте, plastictown, Вы писали:
P>>Доброго времени суток! Дабы не заплесневеть, решил сделать на Си динамический массив типа std::vector. Все работает, я доволен, но не могу выделить больше ~800Кб памяти (на самом деле в 4 раза больше с учетом дополнительного буфера). Пишет Not enough space. Читал форумы, говорят, что malloc умеет выделять память только подряд или вроде того, а подряд может не быть. Как же тогда же делить 10 Мб, если нужно? делать список вместо массива? Или я чего-то не понимаю?
_>наиболее вероятные причины:
_>1. у тебя косяк в коде. _>2. у тебя косяк в коде. _>3. у тебя косяк в коде. _>... _>100. проблемы с железом. _>101. косяк в стандартной либе.
У меня первая причина. Жирный такой косяк, но незаметный. Подправил, теперь отказывается выделять 1,5 гига за раз Это уж я как-нибудь переживу.
Здравствуйте, Serg27, Вы писали:
S>Здравствуйте, plastictown, Вы писали:
S>Если бы Вы спросили на stackoverflow, то Вы мгновенно получили бы ссылку на how-to-ask. Очень полезно (и также дали бы ссылку) — How to create a Minimal, Complete, and Verifiable example
S>По делу. Без кода, без подробностей (компилятор, его ключи, платформа и т.п.) никто Вам не поможет. Ваш случай уникальный — миллионы людей по всему миру вот уже более 40 лет пользуются malloc. Десятки тысяч коммерческих продуктов работают и "выгребают" всю возможную память из системы. А тут жалкие 800Кб...
Я вообще мастер плодить уникальные баги Тем не менее, исправился и инструкцию по написанию вопросов прочитал, следующий раз непременно воспользуюсь.
Я уже писал свои результаты по двум платформам, а где бы можно было подробнее почитать про работу malloc, потому что при разных запусках получаются разные результаты и хотелось бы знать, чего ожидать от функции наверняка. Почему при 5Гб свободной памяти не выделяет 1,5 Гб, а иногда 700 Мб.
Вот весь код из трех файлов: https://yadi.sk/d/BzlUsApN3GZBjX
Здравствуйте, plastictown, Вы писали:
P>Я уже писал свои результаты по двум платформам, а где бы можно было подробнее почитать про работу malloc, потому что при разных запусках получаются разные результаты и хотелось бы знать, чего ожидать от функции наверняка. Почему при 5Гб свободной памяти не выделяет 1,5 Гб, а иногда 700 Мб.
malloc это обертка над системным вызовом распределения памяти. Есть уровень распределения памяти, которым занимается си-шная рантайм библиотека, но в конечном счете память берется у ОС. Механизм распределения памяти считается одним из важнейших в ОС. Так что смотрите в этом направление, если это Вам интересно.
Вам уже писали, что получить память одним БОЛЬШИМ куском могут быть проблемы, так как у системы может уже не быть такого куска. Особенно если она уже поработала.
Для Windows есть известные утилиты VMMap и RAMMap которые показывают информацию о памяти в этой ОС
Здравствуйте, Serg27, Вы писали:
S>malloc это обертка над системным вызовом распределения памяти. Есть уровень распределения памяти, которым занимается си-шная рантайм библиотека, но в конечном счете память берется у ОС. Механизм распределения памяти считается одним из важнейших в ОС. Так что смотрите в этом направление, если это Вам интересно. S>Вам уже писали, что получить память одним БОЛЬШИМ куском могут быть проблемы, так как у системы может уже не быть такого куска. Особенно если она уже поработала. S>Для Windows есть известные утилиты VMMap и RAMMap которые показывают информацию о памяти в этой ОС
Здравствуйте, plastictown, Вы писали:
P>Я уже писал свои результаты по двум платформам, а где бы можно было подробнее почитать про работу malloc, потому что при разных запусках получаются разные результаты и хотелось бы знать, чего ожидать от функции наверняка. Почему при 5Гб свободной памяти не выделяет 1,5 Гб, а иногда 700 Мб.
К уже сказанному добавлю
Если речь идёт об обычной системе, вроде Windows, то:
1. Программа так как работает со своей виртуальной памятью, а не с физической памятью.
Из этого следует, что соображения про "уже поработавшую систему" надо распространять не на систему, а на программу.
Поэтому в самом начале работы программы, скорее всего, можно выделить большой кусок, а дальше уже как получится.
2. Ограничения вроде "меньше 2 ГБ" или "меньше 4 ГБ" часто следуют из 32-битности приложения. Такое приложение в принципе 5 ГБ через malloc не выделит. Нужно ли выделять 5 ГБ через malloc — уже другой вопрос, но если хочется, и есть возможность использовать 64-битное приложение, то с 64-битным приложением, скорее всего, получится.
P>Подправил, теперь отказывается выделять 1,5 гига за раз
А это нормально. Адресного пространства в 32-битных приложениях под Windows обычно 2 Гб, части его заняты, свободный непрерывный кусок примерно 1.5 Гб.
Здравствуйте, plastictown, Вы писали:
P>Здравствуйте, Serg27, Вы писали:
S>>Здравствуйте, plastictown, Вы писали:
S>>Если бы Вы спросили на stackoverflow, то Вы мгновенно получили бы ссылку на how-to-ask. Очень полезно (и также дали бы ссылку) — How to create a Minimal, Complete, and Verifiable example
S>>По делу. Без кода, без подробностей (компилятор, его ключи, платформа и т.п.) никто Вам не поможет. Ваш случай уникальный — миллионы людей по всему миру вот уже более 40 лет пользуются malloc. Десятки тысяч коммерческих продуктов работают и "выгребают" всю возможную память из системы. А тут жалкие 800Кб...
P>Я вообще мастер плодить уникальные баги Тем не менее, исправился и инструкцию по написанию вопросов прочитал, следующий раз непременно воспользуюсь. P>Я уже писал свои результаты по двум платформам, а где бы можно было подробнее почитать про работу malloc, потому что при разных запусках получаются разные результаты и хотелось бы знать, чего ожидать от функции наверняка. Почему при 5Гб свободной памяти не выделяет 1,5 Гб, а иногда 700 Мб. P>Вот весь код из трех файлов: https://yadi.sk/d/BzlUsApN3GZBjX
Здравствуйте, MasterZiv, Вы писали:
MZ>Здравствуйте, plastictown, Вы писали:
P>> Читал форумы, говорят, что malloc умеет выделять память только подряд или вроде того, а подряд может не быть.
MZ>Интересно, как ты представляешь себе память, выделенную не подряд ?
Да эдлементарно в общемто.
Старшие 10 бит 31 — 22 линейного адреса, дополненные двумя младшими нулями, служат индексом PDE.
Средние 10 бит 21 — 12 линейного адреса, дополненные двумя младшими нулями, индексируют таблицу страниц PTE. Элемент PTE содержит 20-битный базовый адрес страничного кадра в физической памяти.
Этот базовый адрес из элемента PTE объединяется с младшими 12-ю битами линейного адреса, образуя 32-х битный физический адрес.