powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Сколько памяти в рамках процесса я могу выделить malloc'ом?
20 сообщений из 20, страница 1 из 1
Сколько памяти в рамках процесса я могу выделить malloc'ом?
    #39203372
nop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый всем день.
Итак в рамках некоего проекта мне нужно создавать динамический массив (его величина даже примерно не известна), который может быть весом до 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.
#pragma pack(push, 1)
typedef struct {
	DWORD addr;
	DWORD val;

	BOOL remove;
} FVALUES;
#pragma pack(pop)

#define ALLOC_STEP	500001

/*............................... */

BOOL CeviltestDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();
	int i = 0;
	FVALUES* fValues = (FVALUES *)calloc(ALLOC_STEP, sizeof(FVALUES));

	while(1) {
		
		if(i % (ALLOC_STEP - 1) == 0) {
			if(!(fValues = (FVALUES *)realloc((void *)fValues, sizeof(FVALUES) * (i + ALLOC_STEP)))) {
				CString output; ////23.000.000
				output.Format("Не можем выделить больше памяти. %d значений сохранено, %d КБайт их объём", i, (sizeof(FVALUES) * i) / 1024);
				MessageBox(output, "Err", 0);		
				break;
			}
		}
	
		i++;
	}
/*............................... */



В цикле каждый ALLOC_STEP итераций происходить увеличение выделенной памяти на ALLOC_STEP структур. Так сделано исходя из быстродействия - если я в каждой итерации буду менять размер массива - это значительно медленнее.
В итоге ошибка вывалилась на 45.000.000 итерации. Выделено 527.343кб памяти. Это чистый процесс, не нагруженный ничем кроме системных и МФЦшных библиотек. А на сколько я знаю, процессу доступно аж 2 ГБ оперативы. В списке процессов я вижу, что процесс занимает всего-то 530к КБ РАМ. Аттач приложил.

Отсюда вопросы следующие:
1. Почему realloc не даёт выделить ещё памяти?
2. Как заставить его выделить больше памяти?
3. Что можно использовать кроме malloc-realloc для создания динамического массива большей длины?

Заранее, спасибо за ответ.
...
Рейтинг: 0 / 0
Сколько памяти в рамках процесса я могу выделить malloc'ом?
    #39203387
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nop1. Почему realloc не даёт выделить ещё памяти?
Потому что предыдущими его вызовами ты памть фрагментировал и в ней больше нет
непрерывного куска нужного размера.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сколько памяти в рамках процесса я могу выделить malloc'ом?
    #39203389
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доступно 2 Гб, но выделить можно только непрерывный кусок. Вызовы realloc() дефрагментировали память и максимальный непрерывный кусок стал 0,5 Гб.
Если сразу выделять 1 Гб, то выделится. Если не путаю у меня выделялось 1,7-1,8 Гб, правда без MFC
...
Рейтинг: 0 / 0
Сколько памяти в рамках процесса я могу выделить malloc'ом?
    #39203393
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nop, ну ты хитер старик. Помимо памяти еще и крутишь пустые мегафлопы.

Это зачем? Для прогрева?
Код: plaintext
1.
if(i % (ALLOC_STEP - 1) == 0) {
...
Рейтинг: 0 / 0
Сколько памяти в рамках процесса я могу выделить malloc'ом?
    #39203398
nop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, такая в общем-то мысль и была.
То есть ничего не остаётся кроме как сразу выделять громадный блок памяти?

maytonnop, ну ты хитер старик. Помимо памяти еще и крутишь пустые мегафлопы.

Это зачем? Для прогрева?
Код: plaintext
1.
if(i % (ALLOC_STEP - 1) == 0) {


да я код вытащил прямиком из своего проекта. Между realloc'ами структура собственно и заполняется с каждой итерацией.
...
Рейтинг: 0 / 0
Сколько памяти в рамках процесса я могу выделить malloc'ом?
    #39203406
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nopТо есть ничего не остаётся кроме как сразу выделять громадный блок памяти?

Подумать мозгом "а действительно ли мне здесь нужен непрерывный плоский кусок памяти или
можно организовать данные в дерево или хэш-таблицу, заодно повысив быстродействие их
обработки на пару порядков"?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сколько памяти в рамках процесса я могу выделить malloc'ом?
    #39203408
nop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovnopТо есть ничего не остаётся кроме как сразу выделять громадный блок памяти?

Подумать мозгом "а действительно ли мне здесь нужен непрерывный плоский кусок памяти или
можно организовать данные в дерево или хэш-таблицу, заодно повысив быстродействие их
обработки на пару порядков"?..

Не нужен :)
Я поэтому среди вопросов и оставил пункт про альтернативы. Мне в общем-то всё равно как реализован динамический массив через malloc или ещё как-то. Подскажите тогда ещё варианты.
...
Рейтинг: 0 / 0
Сколько памяти в рамках процесса я могу выделить malloc'ом?
    #39203419
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nopЯ поэтому среди вопросов и оставил пункт про альтернативы. Мне в общем-то всё равно как реализован динамический массив через malloc или ещё как-то. Подскажите тогда ещё варианты.Ты не понял вопроса.
Динамический массив это всегда непрырвный кусок памяти.
Но тебе изначально нужно то что? Отвечаю: Хранить много данных в памяти. А для решения этой задачи, вовсе не обязательно использовать только массивы, есть и другие способы храния информации: списки, деревья. Даже сегментированные массивы можно использовать если очень хочется.
Сделай например массив:
Код: plaintext
1.
2.
3.
FVALUES **segments = calloc(COUNT_OF_SEGMENTS, sizeof(*FVALUES));
segments[n] = calloc(SEGMENT_SIZE, sizeof(FVALUES));
FVALUIES * item = &(segments[n][i]); // i-ый элемент в n-ном сегменте

Все просто и легко.
...
Рейтинг: 0 / 0
Сколько памяти в рамках процесса я могу выделить malloc'ом?
    #39203428
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХУ Универсальной замены нет, может std::list или std::map, std::unordered_map подойдут. Зависит от задачи. Задача нестандартная, раз гиг надо в памяти разместить.
Ты бы немного описал что делаешь, может чего и посоветуют поконкретнее.

На x64 не хочешь откомпилировать?
...
Рейтинг: 0 / 0
Сколько памяти в рамках процесса я могу выделить malloc'ом?
    #39203434
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И да... Если в памяти надо держать целый гигабайт - ты явно делаешь что-то очень странное и редкое.
Может стоит использовать базу данных?
...
Рейтинг: 0 / 0
Сколько памяти в рамках процесса я могу выделить malloc'ом?
    #39203459
nop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlИ да... Если в памяти надо держать целый гигабайт - ты явно делаешь что-то очень странное и редкое.
Может стоит использовать базу данных?
Dima TИМХУ Универсальной замены нет, может std::list или std::map, std::unordered_map подойдут. Зависит от задачи. Задача нестандартная, раз гиг надо в памяти разместить.
Ты бы немного описал что делаешь, может чего и посоветуют поконкретнее.

На x64 не хочешь откомпилировать?
Я делаю программу на подобии Artmoney. Она должна давать пользователю возможность искать, допустим, все целочисленные значения в памяти другого приложения. А потом делать выборку среди них - допустим, отсеивать те, которые уменьшились. Для этих целей надо сохранять все найденные значения. А это может быть и больше гига с учётом того, что нужно хранить ещё и адрес каждого значения. И потом, вы же понимаете, что приложение должно работать с играми, которые могут легко занять под 2 гига оперативы. При этом это всё должно ещё и быстро работать.

White OwlnopЯ поэтому среди вопросов и оставил пункт про альтернативы. Мне в общем-то всё равно как реализован динамический массив через malloc или ещё как-то. Подскажите тогда ещё варианты.Ты не понял вопроса.
Динамический массив это всегда непрырвный кусок памяти.
Но тебе изначально нужно то что? Отвечаю: Хранить много данных в памяти. А для решения этой задачи, вовсе не обязательно использовать только массивы, есть и другие способы храния информации: списки, деревья. Даже сегментированные массивы можно использовать если очень хочется.
Сделай например массив:
Код: plaintext
1.
2.
3.
FVALUES **segments = calloc(COUNT_OF_SEGMENTS, sizeof(*FVALUES));
segments[n] = calloc(SEGMENT_SIZE, sizeof(FVALUES));
FVALUIES * item = &(segments[n][i]); // i-ый элемент в n-ном сегменте

Все просто и легко.
Спасибо. Как раз про двумерный массив и думал, пока ждал ответа.
...
Рейтинг: 0 / 0
Сколько памяти в рамках процесса я могу выделить malloc'ом?
    #39203468
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nopЯ делаю программу на подобии Artmoney. Она должна давать пользователю возможность искать, допустим, все целочисленные значения в памяти другого приложения. А потом делать выборку среди них - допустим, отсеивать те, которые уменьшились. Для этих целей надо сохранять все найденные значения. А это может быть и больше гига с учётом того, что нужно хранить ещё и адрес каждого значения. И потом, вы же понимаете, что приложение должно работать с играми, которые могут легко занять под 2 гига оперативы. При этом это всё должно ещё и быстро работать.
Так выделяй сразу максимум, только не calloc() а malloc() тогда место в адресном пространстве застолбится, а реальная память будет выделяться по мере использования.
...
Рейтинг: 0 / 0
Сколько памяти в рамках процесса я могу выделить malloc'ом?
    #39203470
nop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TnopЯ делаю программу на подобии Artmoney. Она должна давать пользователю возможность искать, допустим, все целочисленные значения в памяти другого приложения. А потом делать выборку среди них - допустим, отсеивать те, которые уменьшились. Для этих целей надо сохранять все найденные значения. А это может быть и больше гига с учётом того, что нужно хранить ещё и адрес каждого значения. И потом, вы же понимаете, что приложение должно работать с играми, которые могут легко занять под 2 гига оперативы. При этом это всё должно ещё и быстро работать.
Так выделяй сразу максимум, только не calloc() а malloc() тогда место в адресном пространстве застолбится, а реальная память будет выделяться по мере использования.
не понял? calloc и malloc отличаются же только тем, что первый нулями область забивает.
...
Рейтинг: 0 / 0
Сколько памяти в рамках процесса я могу выделить malloc'ом?
    #39203479
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nopDima Tпропущено...

Так выделяй сразу максимум, только не calloc() а malloc() тогда место в адресном пространстве застолбится, а реальная память будет выделяться по мере использования.
не понял? calloc и malloc отличаются же только тем, что первый нулями область забивает.
Именно этим. Раз он забивает, то пройдется по всему выделенному адресному пространству и ОС выделит реальную память. При malloc() обращений не будет и реальная память не будет выделена пока к ней не обратишься.
...
Рейтинг: 0 / 0
Сколько памяти в рамках процесса я могу выделить malloc'ом?
    #39203486
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Засомневался в malloc() поэтому затестил, оказалось calloc() тоже реальную не занимает. Так что без разницы.
Тест. MSVC 2015
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
int main(int argc, char *argv[]) {
	getchar();
	char* p1 = (char*)malloc(100500000);
	printf("%p\n", p1);
	getchar();
	char* p2 = (char*)calloc(100500000, 1);
	printf("%p\n", p2);
	getchar();
	return 0;
}

...
Рейтинг: 0 / 0
Сколько памяти в рамках процесса я могу выделить malloc'ом?
    #39203493
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nopОна должна давать пользователю возможность искать, допустим, все целочисленные
значения в памяти другого приложения. А потом делать выборку среди них - допустим,
отсеивать те, которые уменьшились. Для этих целей надо сохранять все найденные значения. А
это может быть и больше гига с учётом того, что нужно хранить ещё и адрес каждого
значения.
В-первых, не будет. Если, конечно, ты не сделаешь какую-нибудь глупость типа поиска в
сегментах кода. Во-вторых, как раз плоский массив тут - наихудший возможный вариант.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сколько памяти в рамках процесса я могу выделить malloc'ом?
    #39203553
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nop, а в файлах искать нельзя?
...
Рейтинг: 0 / 0
Сколько памяти в рамках процесса я могу выделить malloc'ом?
    #39203615
nop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovnopОна должна давать пользователю возможность искать, допустим, все целочисленные
значения в памяти другого приложения. А потом делать выборку среди них - допустим,
отсеивать те, которые уменьшились. Для этих целей надо сохранять все найденные значения. А
это может быть и больше гига с учётом того, что нужно хранить ещё и адрес каждого
значения.
В-первых, не будет. Если, конечно, ты не сделаешь какую-нибудь глупость типа поиска в
сегментах кода. Во-вторых, как раз плоский массив тут - наихудший возможный вариант.

пока что я сделал опциональную возможность выбора - поиск во всех доступных секциях, либо в тех, к которым есть доступ на запись. А я так полагаю, возможность записи исключает сегмент кода (если конечно сама игра не установила на секцию кода иные права)

maytonnop, а в файлах искать нельзя?
так смысл как раз в том, чтобы в процессе искать динамически изменяющиеся значения. А в файле можно искать простым хекс редактором)
...
Рейтинг: 0 / 0
Сколько памяти в рамках процесса я могу выделить malloc'ом?
    #39203761
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nop
Код: plaintext
1.
2.
3.
4.
int i = 0;
...
CString output; ...
output.Format("Не можем выделить больше памяти. %d значений сохранено, %d КБайт их объём", i, (sizeof(FVALUES) * i) / 1024);

Выделенное выражение -- типа size_t, по стандарту C99 его надо выводить через %zu или %zx, но не все версии Visual C++ это поддерживают. Или можно добавить приведение к типу int, и тогда действительно можно выводить через %d.

nop3. Что можно использовать кроме malloc-realloc для создания динамического массива большей длины?WinAPI-шную функцию VirtualAlloc.
...
Рейтинг: 0 / 0
Сколько памяти в рамках процесса я могу выделить malloc'ом?
    #39203834
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nopmaytonnop, а в файлах искать нельзя?
так смысл как раз в том, чтобы в процессе искать динамически изменяющиеся значения. А в файле можно искать простым хекс редактором)
Тут какая-то натяжка. Может опишешь задачу более полно?
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Сколько памяти в рамках процесса я могу выделить malloc'ом?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]