Форум: "Начинающим";
Текущий архив: 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