Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Сколько памяти в рамках процесса я могу выделить malloc'ом?
|
|||
|---|---|---|---|
|
#18+
Добрый всем день. Итак в рамках некоего проекта мне нужно создавать динамический массив (его величина даже примерно не известна), который может быть весом до 1 ГБ. По причине неизвестных размеров я воспользовался классическим calloc-realloc. ОС Windows 7 x64. Сразу возникла проблема в том, что в рамках рабочего процесса мне удалось выделить всего 230 МБ памяти под массив, после чего realloc стал упорно возвращать NULL. Я попробовал создать нульцовый MFC проект под MSVC 2012 и загнал туда вот такой код: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. В цикле каждый ALLOC_STEP итераций происходить увеличение выделенной памяти на ALLOC_STEP структур. Так сделано исходя из быстродействия - если я в каждой итерации буду менять размер массива - это значительно медленнее. В итоге ошибка вывалилась на 45.000.000 итерации. Выделено 527.343кб памяти. Это чистый процесс, не нагруженный ничем кроме системных и МФЦшных библиотек. А на сколько я знаю, процессу доступно аж 2 ГБ оперативы. В списке процессов я вижу, что процесс занимает всего-то 530к КБ РАМ. Аттач приложил. Отсюда вопросы следующие: 1. Почему realloc не даёт выделить ещё памяти? 2. Как заставить его выделить больше памяти? 3. Что можно использовать кроме malloc-realloc для создания динамического массива большей длины? Заранее, спасибо за ответ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2016, 16:26 |
|
||
|
Сколько памяти в рамках процесса я могу выделить malloc'ом?
|
|||
|---|---|---|---|
|
#18+
nop1. Почему realloc не даёт выделить ещё памяти? Потому что предыдущими его вызовами ты памть фрагментировал и в ней больше нет непрерывного куска нужного размера. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2016, 16:36 |
|
||
|
Сколько памяти в рамках процесса я могу выделить malloc'ом?
|
|||
|---|---|---|---|
|
#18+
Доступно 2 Гб, но выделить можно только непрерывный кусок. Вызовы realloc() дефрагментировали память и максимальный непрерывный кусок стал 0,5 Гб. Если сразу выделять 1 Гб, то выделится. Если не путаю у меня выделялось 1,7-1,8 Гб, правда без MFC ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2016, 16:40 |
|
||
|
Сколько памяти в рамках процесса я могу выделить malloc'ом?
|
|||
|---|---|---|---|
|
#18+
nop, ну ты хитер старик. Помимо памяти еще и крутишь пустые мегафлопы. Это зачем? Для прогрева? Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2016, 16:42 |
|
||
|
Сколько памяти в рамках процесса я могу выделить malloc'ом?
|
|||
|---|---|---|---|
|
#18+
Спасибо, такая в общем-то мысль и была. То есть ничего не остаётся кроме как сразу выделять громадный блок памяти? maytonnop, ну ты хитер старик. Помимо памяти еще и крутишь пустые мегафлопы. Это зачем? Для прогрева? Код: plaintext 1. да я код вытащил прямиком из своего проекта. Между realloc'ами структура собственно и заполняется с каждой итерацией. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2016, 16:45 |
|
||
|
Сколько памяти в рамках процесса я могу выделить malloc'ом?
|
|||
|---|---|---|---|
|
#18+
nopТо есть ничего не остаётся кроме как сразу выделять громадный блок памяти? Подумать мозгом "а действительно ли мне здесь нужен непрерывный плоский кусок памяти или можно организовать данные в дерево или хэш-таблицу, заодно повысив быстродействие их обработки на пару порядков"?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2016, 16:50 |
|
||
|
Сколько памяти в рамках процесса я могу выделить malloc'ом?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovnopТо есть ничего не остаётся кроме как сразу выделять громадный блок памяти? Подумать мозгом "а действительно ли мне здесь нужен непрерывный плоский кусок памяти или можно организовать данные в дерево или хэш-таблицу, заодно повысив быстродействие их обработки на пару порядков"?.. Не нужен :) Я поэтому среди вопросов и оставил пункт про альтернативы. Мне в общем-то всё равно как реализован динамический массив через malloc или ещё как-то. Подскажите тогда ещё варианты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2016, 16:52 |
|
||
|
Сколько памяти в рамках процесса я могу выделить malloc'ом?
|
|||
|---|---|---|---|
|
#18+
nopЯ поэтому среди вопросов и оставил пункт про альтернативы. Мне в общем-то всё равно как реализован динамический массив через malloc или ещё как-то. Подскажите тогда ещё варианты.Ты не понял вопроса. Динамический массив это всегда непрырвный кусок памяти. Но тебе изначально нужно то что? Отвечаю: Хранить много данных в памяти. А для решения этой задачи, вовсе не обязательно использовать только массивы, есть и другие способы храния информации: списки, деревья. Даже сегментированные массивы можно использовать если очень хочется. Сделай например массив: Код: plaintext 1. 2. 3. Все просто и легко. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2016, 17:06 |
|
||
|
Сколько памяти в рамках процесса я могу выделить malloc'ом?
|
|||
|---|---|---|---|
|
#18+
ИМХУ Универсальной замены нет, может std::list или std::map, std::unordered_map подойдут. Зависит от задачи. Задача нестандартная, раз гиг надо в памяти разместить. Ты бы немного описал что делаешь, может чего и посоветуют поконкретнее. На x64 не хочешь откомпилировать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2016, 17:10 |
|
||
|
Сколько памяти в рамках процесса я могу выделить malloc'ом?
|
|||
|---|---|---|---|
|
#18+
И да... Если в памяти надо держать целый гигабайт - ты явно делаешь что-то очень странное и редкое. Может стоит использовать базу данных? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2016, 17:12 |
|
||
|
Сколько памяти в рамках процесса я могу выделить malloc'ом?
|
|||
|---|---|---|---|
|
#18+
White OwlИ да... Если в памяти надо держать целый гигабайт - ты явно делаешь что-то очень странное и редкое. Может стоит использовать базу данных? Dima TИМХУ Универсальной замены нет, может std::list или std::map, std::unordered_map подойдут. Зависит от задачи. Задача нестандартная, раз гиг надо в памяти разместить. Ты бы немного описал что делаешь, может чего и посоветуют поконкретнее. На x64 не хочешь откомпилировать? Я делаю программу на подобии Artmoney. Она должна давать пользователю возможность искать, допустим, все целочисленные значения в памяти другого приложения. А потом делать выборку среди них - допустим, отсеивать те, которые уменьшились. Для этих целей надо сохранять все найденные значения. А это может быть и больше гига с учётом того, что нужно хранить ещё и адрес каждого значения. И потом, вы же понимаете, что приложение должно работать с играми, которые могут легко занять под 2 гига оперативы. При этом это всё должно ещё и быстро работать. White OwlnopЯ поэтому среди вопросов и оставил пункт про альтернативы. Мне в общем-то всё равно как реализован динамический массив через malloc или ещё как-то. Подскажите тогда ещё варианты.Ты не понял вопроса. Динамический массив это всегда непрырвный кусок памяти. Но тебе изначально нужно то что? Отвечаю: Хранить много данных в памяти. А для решения этой задачи, вовсе не обязательно использовать только массивы, есть и другие способы храния информации: списки, деревья. Даже сегментированные массивы можно использовать если очень хочется. Сделай например массив: Код: plaintext 1. 2. 3. Все просто и легко. Спасибо. Как раз про двумерный массив и думал, пока ждал ответа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2016, 17:25 |
|
||
|
Сколько памяти в рамках процесса я могу выделить malloc'ом?
|
|||
|---|---|---|---|
|
#18+
nopЯ делаю программу на подобии Artmoney. Она должна давать пользователю возможность искать, допустим, все целочисленные значения в памяти другого приложения. А потом делать выборку среди них - допустим, отсеивать те, которые уменьшились. Для этих целей надо сохранять все найденные значения. А это может быть и больше гига с учётом того, что нужно хранить ещё и адрес каждого значения. И потом, вы же понимаете, что приложение должно работать с играми, которые могут легко занять под 2 гига оперативы. При этом это всё должно ещё и быстро работать. Так выделяй сразу максимум, только не calloc() а malloc() тогда место в адресном пространстве застолбится, а реальная память будет выделяться по мере использования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2016, 17:29 |
|
||
|
Сколько памяти в рамках процесса я могу выделить malloc'ом?
|
|||
|---|---|---|---|
|
#18+
Dima TnopЯ делаю программу на подобии Artmoney. Она должна давать пользователю возможность искать, допустим, все целочисленные значения в памяти другого приложения. А потом делать выборку среди них - допустим, отсеивать те, которые уменьшились. Для этих целей надо сохранять все найденные значения. А это может быть и больше гига с учётом того, что нужно хранить ещё и адрес каждого значения. И потом, вы же понимаете, что приложение должно работать с играми, которые могут легко занять под 2 гига оперативы. При этом это всё должно ещё и быстро работать. Так выделяй сразу максимум, только не calloc() а malloc() тогда место в адресном пространстве застолбится, а реальная память будет выделяться по мере использования. не понял? calloc и malloc отличаются же только тем, что первый нулями область забивает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2016, 17:31 |
|
||
|
Сколько памяти в рамках процесса я могу выделить malloc'ом?
|
|||
|---|---|---|---|
|
#18+
nopDima Tпропущено... Так выделяй сразу максимум, только не calloc() а malloc() тогда место в адресном пространстве застолбится, а реальная память будет выделяться по мере использования. не понял? calloc и malloc отличаются же только тем, что первый нулями область забивает. Именно этим. Раз он забивает, то пройдется по всему выделенному адресному пространству и ОС выделит реальную память. При malloc() обращений не будет и реальная память не будет выделена пока к ней не обратишься. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2016, 17:39 |
|
||
|
Сколько памяти в рамках процесса я могу выделить malloc'ом?
|
|||
|---|---|---|---|
|
#18+
Засомневался в malloc() поэтому затестил, оказалось calloc() тоже реальную не занимает. Так что без разницы. Тест. MSVC 2015 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2016, 17:45 |
|
||
|
Сколько памяти в рамках процесса я могу выделить malloc'ом?
|
|||
|---|---|---|---|
|
#18+
nopОна должна давать пользователю возможность искать, допустим, все целочисленные значения в памяти другого приложения. А потом делать выборку среди них - допустим, отсеивать те, которые уменьшились. Для этих целей надо сохранять все найденные значения. А это может быть и больше гига с учётом того, что нужно хранить ещё и адрес каждого значения. В-первых, не будет. Если, конечно, ты не сделаешь какую-нибудь глупость типа поиска в сегментах кода. Во-вторых, как раз плоский массив тут - наихудший возможный вариант. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2016, 17:49 |
|
||
|
Сколько памяти в рамках процесса я могу выделить malloc'ом?
|
|||
|---|---|---|---|
|
#18+
nop, а в файлах искать нельзя? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2016, 18:42 |
|
||
|
Сколько памяти в рамках процесса я могу выделить malloc'ом?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovnopОна должна давать пользователю возможность искать, допустим, все целочисленные значения в памяти другого приложения. А потом делать выборку среди них - допустим, отсеивать те, которые уменьшились. Для этих целей надо сохранять все найденные значения. А это может быть и больше гига с учётом того, что нужно хранить ещё и адрес каждого значения. В-первых, не будет. Если, конечно, ты не сделаешь какую-нибудь глупость типа поиска в сегментах кода. Во-вторых, как раз плоский массив тут - наихудший возможный вариант. пока что я сделал опциональную возможность выбора - поиск во всех доступных секциях, либо в тех, к которым есть доступ на запись. А я так полагаю, возможность записи исключает сегмент кода (если конечно сама игра не установила на секцию кода иные права) maytonnop, а в файлах искать нельзя? так смысл как раз в том, чтобы в процессе искать динамически изменяющиеся значения. А в файле можно искать простым хекс редактором) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2016, 20:06 |
|
||
|
Сколько памяти в рамках процесса я могу выделить malloc'ом?
|
|||
|---|---|---|---|
|
#18+
nop Код: plaintext 1. 2. 3. 4. Выделенное выражение -- типа size_t, по стандарту C99 его надо выводить через %zu или %zx, но не все версии Visual C++ это поддерживают. Или можно добавить приведение к типу int, и тогда действительно можно выводить через %d. nop3. Что можно использовать кроме malloc-realloc для создания динамического массива большей длины?WinAPI-шную функцию VirtualAlloc. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2016, 04:05 |
|
||
|
Сколько памяти в рамках процесса я могу выделить malloc'ом?
|
|||
|---|---|---|---|
|
#18+
nopmaytonnop, а в файлах искать нельзя? так смысл как раз в том, чтобы в процессе искать динамически изменяющиеся значения. А в файле можно искать простым хекс редактором) Тут какая-то натяжка. Может опишешь задачу более полно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2016, 09:40 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=37&tid=2018568]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
29ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
79ms |
get tp. blocked users: |
1ms |
| others: | 275ms |
| total: | 428ms |

| 0 / 0 |
