C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Out Of Memory, А памяти есть...
Boyko
Отправлено: 11.10.2005, 16:59


Станционный диспетчер

Группа: Участник
Сообщений: 88



Делаю большой масив (TBaseArray) — 800MB в памяти и ошибка появляется Out Of Memory. Купил еще 1ГБ память и опять тоже самая ошибка на тоже самом месте! А таск менажер говорит что еще 500 МБ свободние имею! Променял в Project->Options->Linker->Min/Max Heap — ничего!

Кто-нибудь может идею подсказать...
BreakPointMAN
Отправлено: 11.10.2005, 22:28


Станционный диспетчер

Группа: Участник
Сообщений: 86



< offtop>
имхо, потребность в создании чрезмерно больших массивов в памяти — следствие плохой проработки проекта...
< /offtop>
Boyko
Отправлено: 13.10.2005, 10:57


Станционный диспетчер

Группа: Участник
Сообщений: 88



QUOTE (BreakPointMAN @ 11/10/2005, 21:28)

имхо, потребность в создании чрезмерно больших массивов в памяти — следствие плохой проработки проекта...

Просто хочу сделать сортирование большого массива в памяти...
Guest
Отправлено: 13.10.2005, 11:55


Не зарегистрирован







< offtop>
QUOTE
Просто хочу сделать сортирование большого массива в памяти...

И как только сервера БД сортируют огромные массивы в маленькой памяти???
И очень даже эффективно, надо заметить. smile.gif
< /offtop>
Георгий
Отправлено: 13.10.2005, 22:07


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



на ноуте с 256 метрами мозгов написал
CODE
const int s = 50;
int total = 0;
void * z = 0;
do{
z = new char[s*1024*1024];
total+=s;
while( z );
AnsiString b(total);
MessageBox(b.c_str(),"mem",MB_OK);
у меня выделилось 700 метров, после чего винда хрюкнула, вывалила предупреждение "недостаточно виртуальной памяти".

ЗЫ. размер файла подкачки у меня как раз 730 метров.

так что поверь все параметры виртуальной памяти

Отредактировано Георгий — 13/10/2005, 23:08
Boyko
Отправлено: 14.10.2005, 16:44


Станционный диспетчер

Группа: Участник
Сообщений: 88



QUOTE (Guest @ 13/10/2005, 10:55)
И как только сервера БД сортируют огромные массивы в маленькой памяти???

Все таки я не сервер, я человек ленивый. Я написал маленькую програмку (метод TBaseArray) QuickSort. И сортировал 200мб в памяти меньше чем 1 мин. Хотел использовать тоже самой QuickSort и для 1гб...

2 Георгий
Какие параметры?
Георгий
Отправлено: 15.10.2005, 11:24


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



QUOTE (Boyko @ 14/10/2005, 17:44)
QUOTE (Guest @ 13/10/2005, 10:55)
И как только сервера БД сортируют огромные массивы в маленькой памяти???
2 Георгий
Какие параметры?

пуск -> панель управления -> система -> дополнительно -> быстродействие -> дополнительно -> изменить

и ещё где то в реестре есть параметр, задающий развер виртуального окна, доступного программам (1, 2 или 3 GB)
Boyko
Отправлено: 17.10.2005, 11:45


Станционный диспетчер

Группа: Участник
Сообщений: 88



2 Георгий
QUOTE (Георгий @ 15/10/2005, 10:24)
пуск -> панель управления -> система -> дополнительно -> быстродействие -> дополнительно -> изменить

Здесь нечего делать... Я много попытки сделал.

QUOTE (Георгий @ 15/10/2005, 10:24)
и ещё где то в реестре есть параметр, задающий развер виртуального окна, доступного программам (1, 2 или 3 GB)

Думаю что здесь надо изменить. Как???
Grigoriy
Отправлено: 17.10.2005, 13:31


Мастер участка

Группа: Участник
Сообщений: 381



Не лучше ли будет изменить алгоритм так, чтобы использовать временные файлы и перекачивать в одну область файла небольшой массив информации, а затем считывать из другой области файла новый массив.
Я думаю, скорость обмена будет та же, что и с файлом подкачки, разумеется, если обмениваться как можно большими порциями данных.
Boyko
Отправлено: 20.10.2005, 16:54


Станционный диспетчер

Группа: Участник
Сообщений: 88



QUOTE (Grigoriy @ 17/10/2005, 12:31)
Не лучше ли будет изменить алгоритм так, чтобы использовать временные файлы и перекачивать в одну область файла небольшой массив информации, а затем считывать из другой области файла новый массив.
Я думаю, скорость обмена будет та же, что и с файлом подкачки, разумеется, если обмениваться как можно большими порциями данных.

Может быть... Только я не могу понимать почему память ест, а я вижу это грязное сообщение "Out of memory". Я думаю что все таки можно именить какого-то параметра...
Grigoriy
Отправлено: 20.10.2005, 21:19


Мастер участка

Группа: Участник
Сообщений: 381



QUOTE (Boyko @ 20/10/2005, 16:54)
QUOTE (Grigoriy @ 17/10/2005, 12:31)
Не лучше ли будет изменить алгоритм так, чтобы использовать временные файлы и перекачивать в одну область файла небольшой массив информации, а затем считывать из другой области файла новый массив.
Я думаю, скорость обмена будет та же, что и с файлом подкачки, разумеется, если обмениваться как можно большими порциями данных.

Может быть... Только я не могу понимать почему память ест, а я вижу это грязное сообщение "Out of memory". Я думаю что все таки можно именить какого-то параметра...

Выделять память для таких больших массивов надо на этапе прогона программы с помощью функций malloc, realloc.
Не в коем случае не использовать стек для больших массивов.
Boyko
Отправлено: 21.10.2005, 15:10


Станционный диспетчер

Группа: Участник
Сообщений: 88



QUOTE (Grigoriy @ 20/10/2005, 20:19)

Не в коем случае не использовать стек для больших массивов.

TBaseArray заделяет динамическую память из heap-а, думаю что стек здесь не используется...

Все таки вопрос принципиальный: Почему TBaseArray не может использовать наличную память? И почему Out Of Memory появляется на тоже самом месте при 1,5 ГБ как при 512 МБ? И почему 550 МБ свободные в тоже самом моменте?

Отредактировано Boyko — 24/10/2005, 09:23
Boyko
Отправлено: 26.10.2005, 15:32


Станционный диспетчер

Группа: Участник
Сообщений: 88



Видно что к сожалению никто не знает...

Вернуться в Вопросы программирования в C++Builder