![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Код:
procedure TForm1.Button1Click(Sender: TObject); var list: TStringList; i: Integer; str,str2: string; begin button1.Caption:='Start'; list:= TStringList.Create; list.clear; str:=''; for i:=0 to 200 do str:=str+IntToStr(i); //длина строки 493 символа. for i:=0 to 10000000 do begin list.Add(str); end; button1.Caption:='End'; list.Free; end; lmikle: пользуемся тегами!!! Так все работает отлично. Память сильно не расходуется. но если заменить строку list.Add(str); на list.Add(str + '1'); или str2:=str + '1'; list.Add(str2); то приложение вылетает с руганью на окончание памяти. А если так сделать str2:=str; list.Add(str2); то тоже никаких проблем с памятью win7 delphi 7 ram 8gb Последний раз редактировалось lmikle, 23.09.2012 в 08:42. |
#2
|
||||
|
||||
![]() Вот смотри: ты добавляешь строку размером 493 символа (493 байта) 10000000 раз = 4930000000 байта пр. равн. 10 мб. А вот если ты еще каждый раз прибавишь по '1' в конец каждой строки, то размер будет
4930000000+10000000^2-(10000000^2-10000000)/2; Дальше считай сам ![]() |
#3
|
|||
|
|||
![]() Цитата:
![]() |
#4
|
||||
|
||||
![]() Цитата:
Пример: Код:
str := StringOfChar('X', 1024 * 1024); // Создаём новую строку str размером в мегабайт str2 := str + '1'; // Создаём новую строку str2 и копируем в неё содержимое str плюс сивол '1' for i := 1 to 1000000 do begin list.Add(str2); // В список list добавляется миллион раз ссылка на строку str2 end; Другой пример: Код:
str := StringOfChar('X', 1024 * 1024); // Создаём новую строку str размером в мегабайт for i := 1 to 1000000 do begin str2 := str + '1'; // Создаём новую строку str2 и копируем в неё содержимое str плюс сивол '1' list.Add(str2); // В список list добавляется миллион раз ссылка на строку str2 end; ![]() |
#5
|
|||
|
|||
![]() Да, я знаю что 32 бита больше 2 гигов рамы не увидит.
Спасибо. За развернутое пояснение. Как можно избежать перерасхода памяти в моем примере? |
#6
|
||||
|
||||
![]() Цитата:
|
#7
|
|||
|
|||
![]() Создать огромный список неодинаковых строк.
|
#8
|
||||
|
||||
![]() Цитата:
|
#9
|
|||
|
|||
![]() Все, понял. Не сразу дошел смысл вашего описания про указатели.
Спасибо. Но кстати, да, интересно. Как обойти ограничение винды? ![]() наверное, даже не винды, а 32 битной дельфи. |
#10
|
|||
|
|||
![]() Цитата:
![]() |
#11
|
||||
|
||||
![]() БД:
id: number; // номер строки str: varchar; // строка Пишу программы за еду. __________________ |
#12
|
||||
|
||||
![]() Если строки такие как приведены в примере, то могу посоветовать почитать вот это.
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#13
|
||||
|
||||
![]() Ещё можно воспользоваться интересной, но, насколько мне известно, редко используемой возможностью создания "Временных" временных файлов. Такой файл создаётся, но хранится не на диске, а в оперативной памяти пока её хватает и главное что при этом не ограничивается объёмом 2GB. Но даже когда закончится свободное место в оперативке, то такой файл будет частично сбрасываться на диск вместо того чтобы сообщать о нехватке памяти - главное чтобы было достаточно свободного места на диске.
|
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
~TB~ (25.09.2012)
|
#14
|
||||
|
||||
![]() Почему редко, очень даже часто используемая вохможность.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#15
|
|||
|
|||
![]() Цитата:
Возможно немного некропостинг, но как вариант - использовать свежие версии Delphi. |