Выделение памяти malloc
От: plastictown Норвегия  
Дата: 01.04.17 16:52
Оценка:
Доброго времени суток! Дабы не заплесневеть, решил сделать на Си динамический массив типа std::vector. Все работает, я доволен, но не могу выделить больше ~800Кб памяти (на самом деле в 4 раза больше с учетом дополнительного буфера). Пишет Not enough space. Читал форумы, говорят, что malloc умеет выделять память только подряд или вроде того, а подряд может не быть. Как же тогда же делить 10 Мб, если нужно? делать список вместо массива? Или я чего-то не понимаю?
Спасибо!
c malloc
Re: Выделение памяти malloc
От: kov_serg Россия  
Дата: 02.04.17 00:21
Оценка:
Здравствуйте, plastictown, Вы писали:

P>Доброго времени суток! Дабы не заплесневеть, решил сделать на Си динамический массив типа std::vector. Все работает, я доволен, но не могу выделить больше ~800Кб памяти (на самом деле в 4 раза больше с учетом дополнительного буфера). Пишет Not enough space. Читал форумы, говорят, что malloc умеет выделять память только подряд или вроде того, а подряд может не быть. Как же тогда же делить 10 Мб, если нужно? делать список вместо массива? Или я чего-то не понимаю?

P>Спасибо!
А под какую платформы вы пишите?
Re[2]: Выделение памяти malloc
От: plastictown Норвегия  
Дата: 02.04.17 00:55
Оценка:
Здравствуйте, kov_serg, Вы писали:
_>А под какую платформы вы пишите?

Под виндой x64 получается не больше ~200000 штук uint32_t, под Linux x64 (Mint) на ~45000 говорит "невозможно выделить память". gcc на обеих платформах. свободной памяти несколько гигабайт.
Re: Выделение памяти malloc
От: const_volatile  
Дата: 02.04.17 02:55
Оценка: 3 (1)
Здравствуйте, plastictown, Вы писали:

P>Доброго времени суток! Дабы не заплесневеть, решил сделать на Си динамический массив типа std::vector. Все работает, я доволен, но не могу выделить больше ~800Кб памяти (на самом деле в 4 раза больше с учетом дополнительного буфера). Пишет Not enough space. Читал форумы, говорят, что malloc умеет выделять память только подряд или вроде того, а подряд может не быть. Как же тогда же делить 10 Мб, если нужно? делать список вместо массива? Или я чего-то не понимаю?


наиболее вероятные причины:

1. у тебя косяк в коде.
2. у тебя косяк в коде.
3. у тебя косяк в коде.
...
100. проблемы с железом.
101. косяк в стандартной либе.
Re: Если бы Вы спросили на stackoverflow
От: Serg27  
Дата: 02.04.17 05:35
Оценка: +5
Здравствуйте, plastictown, Вы писали:

Если бы Вы спросили на stackoverflow, то Вы мгновенно получили бы ссылку на how-to-ask. Очень полезно (и также дали бы ссылку) — How to create a Minimal, Complete, and Verifiable example

По делу. Без кода, без подробностей (компилятор, его ключи, платформа и т.п.) никто Вам не поможет. Ваш случай уникальный — миллионы людей по всему миру вот уже более 40 лет пользуются malloc. Десятки тысяч коммерческих продуктов работают и "выгребают" всю возможную память из системы. А тут жалкие 800Кб...
Re: Выделение памяти malloc
От: rg45 СССР  
Дата: 02.04.17 08:29
Оценка: +1
Здравствуйте, plastictown, Вы писали:

P>Доброго времени суток! Дабы не заплесневеть, решил сделать на Си динамический массив типа std::vector. Все работает, я доволен, но не могу выделить больше ~800Кб памяти (на самом деле в 4 раза больше с учетом дополнительного буфера). Пишет Not enough space. Читал форумы, говорят, что malloc умеет выделять память только подряд или вроде того, а подряд может не быть. Как же тогда же делить 10 Мб, если нужно? делать список вместо массива? Или я чего-то не понимаю?


1. Одно из требований стандарта к std::vector — это чтобы все его элементы располагались в непрерывной области памяти. Поэтому если сделать список вместо массива, это уже будет существенно отличаться от std::vector.

2. Просто, что бы убедиться, что проблема именно в malloc, попробуй создать приложение в котором не будет ничего, кроме одиночного выделения памяти с помощью malloc. Если проблема при этом исчезнет, то ищи ошибку в своем коде.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 02.04.2017 8:31 rg45 . Предыдущая версия . Еще …
Отредактировано 02.04.2017 8:30 rg45 . Предыдущая версия .
Re[2]: Если бы Вы спросили на stackoverflow
От: SaZ  
Дата: 02.04.17 12:35
Оценка: 1 (1)
Здравствуйте, Serg27, Вы писали:

S>Здравствуйте, plastictown, Вы писали:


S>Если бы Вы спросили на stackoverflow, то Вы мгновенно получили бы ссылку на how-to-ask. Очень полезно (и также дали бы ссылку) — How to create a Minimal, Complete, and Verifiable example


Да зачем так далеко: https://rsdn.org/Info/Howtoask.xml
Re[3]: Если бы Вы спросили на stackoverflow
От: Serg27  
Дата: 02.04.17 12:51
Оценка: 1 (1)
Здравствуйте, SaZ, Вы писали:

  Offtop
SaZ>Да зачем так далеко: https://rsdn.org/Info/Howtoask.xml
Каюсь, не читал... В свое оправдание — на SE действительно отправляют читать новичков по этим ссылкам. У нас не припомню. Да и наш текст более длинный...
Re[2]: Выделение памяти malloc
От: plastictown Норвегия  
Дата: 02.04.17 15:36
Оценка:
Здравствуйте, const_volatile, Вы писали:

_>Здравствуйте, plastictown, Вы писали:


P>>Доброго времени суток! Дабы не заплесневеть, решил сделать на Си динамический массив типа std::vector. Все работает, я доволен, но не могу выделить больше ~800Кб памяти (на самом деле в 4 раза больше с учетом дополнительного буфера). Пишет Not enough space. Читал форумы, говорят, что malloc умеет выделять память только подряд или вроде того, а подряд может не быть. Как же тогда же делить 10 Мб, если нужно? делать список вместо массива? Или я чего-то не понимаю?


_>наиболее вероятные причины:


_>1. у тебя косяк в коде.

_>2. у тебя косяк в коде.
_>3. у тебя косяк в коде.
_>...
_>100. проблемы с железом.
_>101. косяк в стандартной либе.

У меня первая причина. Жирный такой косяк, но незаметный. Подправил, теперь отказывается выделять 1,5 гига за раз Это уж я как-нибудь переживу.
Re[2]: Если бы Вы спросили на stackoverflow
От: plastictown Норвегия  
Дата: 02.04.17 16:10
Оценка:
Здравствуйте, 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
Re[3]: Если бы Вы спросили на stackoverflow
От: Serg27  
Дата: 02.04.17 16:45
Оценка: 3 (1) +1
Здравствуйте, plastictown, Вы писали:

P>Я уже писал свои результаты по двум платформам, а где бы можно было подробнее почитать про работу malloc, потому что при разных запусках получаются разные результаты и хотелось бы знать, чего ожидать от функции наверняка. Почему при 5Гб свободной памяти не выделяет 1,5 Гб, а иногда 700 Мб.


malloc это обертка над системным вызовом распределения памяти. Есть уровень распределения памяти, которым занимается си-шная рантайм библиотека, но в конечном счете память берется у ОС. Механизм распределения памяти считается одним из важнейших в ОС. Так что смотрите в этом направление, если это Вам интересно.
Вам уже писали, что получить память одним БОЛЬШИМ куском могут быть проблемы, так как у системы может уже не быть такого куска. Особенно если она уже поработала.
Для Windows есть известные утилиты VMMap и RAMMap которые показывают информацию о памяти в этой ОС
Re[4]: Если бы Вы спросили на stackoverflow
От: plastictown Норвегия  
Дата: 02.04.17 17:19
Оценка:
Здравствуйте, Serg27, Вы писали:

S>malloc это обертка над системным вызовом распределения памяти. Есть уровень распределения памяти, которым занимается си-шная рантайм библиотека, но в конечном счете память берется у ОС. Механизм распределения памяти считается одним из важнейших в ОС. Так что смотрите в этом направление, если это Вам интересно.

S>Вам уже писали, что получить память одним БОЛЬШИМ куском могут быть проблемы, так как у системы может уже не быть такого куска. Особенно если она уже поработала.
S>Для Windows есть известные утилиты VMMap и RAMMap которые показывают информацию о памяти в этой ОС

Спасибо, понял!
Re[3]: Если бы Вы спросили на stackoverflow
От: Alexander G Украина  
Дата: 02.04.17 17:42
Оценка:
Здравствуйте, plastictown, Вы писали:

P>Я уже писал свои результаты по двум платформам, а где бы можно было подробнее почитать про работу malloc, потому что при разных запусках получаются разные результаты и хотелось бы знать, чего ожидать от функции наверняка. Почему при 5Гб свободной памяти не выделяет 1,5 Гб, а иногда 700 Мб.


К уже сказанному добавлю

Если речь идёт об обычной системе, вроде Windows, то:
1. Программа так как работает со своей виртуальной памятью, а не с физической памятью.
Из этого следует, что соображения про "уже поработавшую систему" надо распространять не на систему, а на программу.
Поэтому в самом начале работы программы, скорее всего, можно выделить большой кусок, а дальше уже как получится.
2. Ограничения вроде "меньше 2 ГБ" или "меньше 4 ГБ" часто следуют из 32-битности приложения. Такое приложение в принципе 5 ГБ через malloc не выделит. Нужно ли выделять 5 ГБ через malloc — уже другой вопрос, но если хочется, и есть возможность использовать 64-битное приложение, то с 64-битным приложением, скорее всего, получится.
Русский военный корабль идёт ко дну!
Re[3]: Выделение памяти malloc
От: Pavel Dvorkin Россия  
Дата: 03.04.17 02:35
Оценка:
Здравствуйте, plastictown, Вы писали:


P>Подправил, теперь отказывается выделять 1,5 гига за раз


А это нормально. Адресного пространства в 32-битных приложениях под Windows обычно 2 Гб, части его заняты, свободный непрерывный кусок примерно 1.5 Гб.
With best regards
Pavel Dvorkin
Re: Выделение памяти malloc
От: MasterZiv СССР  
Дата: 07.04.17 07:41
Оценка:
Здравствуйте, plastictown, Вы писали:

P> Читал форумы, говорят, что malloc умеет выделять память только подряд или вроде того, а подряд может не быть.


Интересно, как ты представляешь себе память, выделенную не подряд ?
Re[3]: Если бы Вы спросили на stackoverflow
От: Burbulis1978  
Дата: 07.04.17 14:48
Оценка:
Здравствуйте, 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

Лучше всех про malloc и многое,многое другое расскажет
ida
https://www.hex-rays.com/products/ida/support/download.shtml
А так-же WinDBG
https://msdn.microsoft.com/en-us/library/windows/hardware/ff551063(v=vs.85).aspx

они лучшие профессионалы в этой области.
Re[2]: Выделение памяти malloc
От: Burbulis1978  
Дата: 11.04.17 14:40
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>Здравствуйте, plastictown, Вы писали:


P>> Читал форумы, говорят, что malloc умеет выделять память только подряд или вроде того, а подряд может не быть.


MZ>Интересно, как ты представляешь себе память, выделенную не подряд ?



Да эдлементарно в общемто.
Старшие 10 бит 31 — 22 линейного адреса, дополненные двумя младшими нулями, служат индексом PDE.
Средние 10 бит 21 — 12 линейного адреса, дополненные двумя младшими нулями, индексируют таблицу страниц PTE. Элемент PTE содержит 20-битный базовый адрес страничного кадра в физической памяти.
Этот базовый адрес из элемента PTE объединяется с младшими 12-ю битами линейного адреса, образуя 32-х битный физический адрес.

http://ru.bmstu.wiki/%D0%A1%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%BD%D0%B0%D1%8F_%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D1%8C_(%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.