Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.07.13;
Скачать: [xml.tar.bz2];

Вниз

Как избавиться от "Out of memory"?   Найти похожие ветки 

 
Kaer ©   (2008-06-14 13:18) [0]

При работе программы при i>7000(выделено жирным) вылетает ошибка "Out of memory", как от неё избавиться и вобще возможно ли?

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 Data = record
   Res: Int64;
   A, B: integer;
 end;

 TForm1 = class(TForm)
   Button1: TButton;
   Edit1: TEdit;
   Memo1: TMemo;
   procedure Button1Click(Sender: TObject);
   Procedure sortDiff(m, l: Integer);
   Procedure sortSumm(m, l: Integer);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 Diff, Summ: array of Data;
 a,b,i,j,z: integer;
 d: TextFile;
 a_2, b_2: int64;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
i:=StrToInt(Edit1.Text);
 z:=i*(i+1) div 2;
 SetLength(Diff,z+1);
 SetLength(Summ,z+1);
 AssignFile(d,"Пов_числа.txt");
 ReWrite(d);

 Memo1.Lines.Add(TimeToStr(Time)+" - Запуск");
 Memo1.Lines.Add(TimeToStr(Time)+" - Расчет массива...");
 j:=1;
 for a := 1 to i do
   for b := 1 to a do
   begin
     a_2:=a*a;
     b_2:=b*b;
     Diff[j].Res:=a_2*a_2-b_2*b_2;
     Diff[j].A:=a;
     Diff[j].B:=b;
     Summ[j].Res:=a_2*a_2+b_2*b_2;
     Summ[j].A:=a;
     Summ[j].B:=b;
     Inc(j);
   end;
 Memo1.Lines.Add(TimeToStr(Time)+" - Закончено");

 Memo1.Lines.Add(TimeToStr(Time)+" - Сортировка первой строки...");
 sortDiff(1,z);
 Memo1.Lines.Add(TimeToStr(Time)+" - Закончено");
 Memo1.Lines.Add(TimeToStr(Time)+" - Сортировка второй строки...");
 sortSumm(1,z);
 Memo1.Lines.Add(TimeToStr(Time)+" - Закончено");
 Memo1.Lines.Add(TimeToStr(Time)+" - Сравнение...");

   a:=1;
   b:=1;
   repeat
     if (Diff[a].Res>Summ[b].Res) then Inc(b)
     else if (Diff[a].Res<Summ[b].Res) then Inc(a)
     else if (Diff[a].Res=Summ[b].Res) then
     begin
       Writeln(d, IntToStr(Diff[a].Res));
       Writeln(d,"Строка "+IntToStr(Diff[a].A)+" столбец "+IntToStr(Diff[a].B)+" - 2");
       Writeln(d,"Строка "+IntToStr(Summ[b].A)+" столбец "+IntToStr(Summ[b].B)+" - 3");
       Writeln(d," ");
       Inc(a);
       Inc(b);
     end;
     Application.ProcessMessages;
   until (a>z) or (b>z);
 Memo1.Lines.Add(TimeToStr(Time)+" - Закончено");
 Memo1.Lines.Add(TimeToStr(Time)+" - Обработка завершена");
 CloseFile(d);
end;

procedure TForm1.sortDiff(m, l: Integer);
var
 ii, jj, xx: int64;
 ww: data;
begin
 Application.ProcessMessages;
 ii:=m; jj:=l;
 xx:= Diff[(m+l) div 2].Res;
 Repeat
   While Diff[ii].Res < xx do Inc(ii);
   While Diff[jj].Res > xx do Dec(jj);
   if ii <= jj then
   begin
     ww:= Diff[ii]; Diff[ii]:=Diff[jj]; Diff[jj]:=ww;
     Inc(ii); Dec(jj);
   end;
 Until ii > jj;
 If m < jj then SortDiff(m,jj);
 If ii < l then SortDiff(ii,l);
end;

procedure TForm1.sortSumm(m, l: integer);
var
 ii, jj, xx: int64;
 ww: data;
begin
 Application.ProcessMessages;
 ii:=m; jj:=l;
 xx:= Summ[(m+l) div 2].Res;
 Repeat
   While Summ[ii].Res < xx do Inc(ii);
   While Summ[jj].Res > xx do Dec(jj);
   if ii <= jj then
   begin
     ww:= Summ[ii]; Summ[ii]:=Summ[jj]; Summ[jj]:=ww;
     Inc(ii); Dec(jj);
   end;
 Until ii > jj;
 If m < jj then SortSumm(m,jj);
 If ii < l then SortSumm(ii,l);
end;

end.


 
Milk   (2008-06-14 13:39) [1]

>Kaer ©   (14.06.08 13:18)  
А что у тебя в Edit1.Text?


 
MBo ©   (2008-06-14 13:43) [2]

при i=10000, например, на каждый массив выделяется 800 мегабайт памяти, а все доступное адресное прстранство- 2 гигабайта (физически может быть меньше, если оперативка + своп-файл небольшие)


 
Kaer ©   (2008-06-14 13:43) [3]


> А что у тебя в Edit1.Text?

5000


 
Kaer ©   (2008-06-14 13:45) [4]

оперативка 2 gb + своп еще столькоже


 
MBo ©   (2008-06-14 13:49) [5]

>оперативка 2 gb + своп еще столькоже
тогда не физическое ограничение, а виртуальное - 2 гига


 
Kaer ©   (2008-06-14 13:50) [6]


>  виртуальное - 2 гига

какнибудь обойти можно?


 
MBo ©   (2008-06-14 14:16) [7]

>какнибудь обойти можно?
Файлы (не слишком быстро будет, конечно)
AWE-технология (см. MSDN), но, наверно, придется массивы нарезать на куски.

Впрочем, все эти действия не приведут к существенному улучшению - для расчета чисел до 100000 понадобится хранить 160 гиг, а решение все равно еще не будет найдено


 
Kaer ©   (2008-06-14 14:20) [8]


> MBo ©

спасибо большое
наверное буду завязывать с этими расчетами :)


 
Тын-Дын ©   (2008-06-14 14:27) [9]


> AWE-технология (см. MSDN), но, наверно, придется массивы
> нарезать на куски.


Да и адресация в delphi не позволит так просто работать с памятью...


 
Slym ©   (2008-06-17 06:06) [10]

MBo ©   (14.06.08 13:43) [2]
800 мегабайт памяти

откуда? SizeOf(Data)*10000=160000=156,25кб


 
Slym ©   (2008-06-17 06:08) [11]

Slym ©   (17.06.08 6:06) [10]
загон :) тама [ф квадрате] размер



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.07.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.008 c
15-1210961167
@!!ex
2008-05-16 22:06
2008.07.13
Как писать на С++, а не на Дельфи?


2-1213165605
Кирей
2008-06-11 10:26
2008.07.13
отображение русского текста в компонентах BDE и RAVE


11-1190218398
Vladimir Kladov
2007-09-19 20:13
2008.07.13
Версия 2.80


2-1213098806
ciborg
2008-06-10 15:53
2008.07.13
TComboBox только для чтения


2-1213614267
man
2008-06-16 15:04
2008.07.13
Файл занят другим процессом





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский