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 | Просто хочу сделать сортирование большого массива в памяти... |
И как только сервера БД сортируют огромные массивы в маленькой памяти???
И очень даже эффективно, надо заметить.
< /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
|
Видно что к сожалению никто не знает... |
|