Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.07.13;
Скачать: CL | DM;

Вниз

Как избавиться от "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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.019 c
15-1211878467
ekto
2008-05-27 12:54
2008.07.13
NASM


15-1212131847
123-ий
2008-05-30 11:17
2008.07.13
Delphi или Object Pascal


15-1212225113
Григорьев Антон
2008-05-31 13:11
2008.07.13
Как отучить висту лезть в чужую сеть?


2-1213360199
webpauk
2008-06-13 16:29
2008.07.13
Список MDI окон


15-1211830557
Дмитрий С
2008-05-26 23:35
2008.07.13
Время жизни ком-объекта.