![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как избавиться от "Out of memory"? [D7, XP]
Kaer © (2008-06-14 13:18:00)При работе программы при 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.
Slym (2008-06-17 06:08:00) [1]Slym © (17.06.08 6:06) [10]
загон :) тама [ф квадрате] размер
Slym (2008-06-17 06:06:00) [2]MBo © (14.06.08 13:43) [2]
800 мегабайт памяти
откуда? SizeOf(Data)*10000=160000=156,25кб
Тын-Дын (2008-06-14 14:27:00) [3]
> AWE-технология (см. MSDN), но, наверно, придется массивы
> нарезать на куски.
Да и адресация в delphi не позволит так просто работать с памятью...
Kaer (2008-06-14 14:20:00) [4]
> MBo ©
спасибо большое
наверное буду завязывать с этими расчетами :)
MBo (2008-06-14 14:16:00) [5]>какнибудь обойти можно?
Файлы (не слишком быстро будет, конечно)
AWE-технология (см. MSDN), но, наверно, придется массивы нарезать на куски.
Впрочем, все эти действия не приведут к существенному улучшению - для расчета чисел до 100000 понадобится хранить 160 гиг, а решение все равно еще не будет найдено
Kaer (2008-06-14 13:50:00) [6]
> виртуальное - 2 гига
какнибудь обойти можно?
MBo (2008-06-14 13:49:00) [7]>оперативка 2 gb + своп еще столькоже
тогда не физическое ограничение, а виртуальное - 2 гига
Kaer (2008-06-14 13:45:00) [8]оперативка 2 gb + своп еще столькоже
MBo (2008-06-14 13:43:00) [9]при i=10000, например, на каждый массив выделяется 800 мегабайт памяти, а все доступное адресное прстранство- 2 гигабайта (физически может быть меньше, если оперативка + своп-файл небольшие)
Kaer (2008-06-14 13:43:00) [10]
> А что у тебя в Edit1.Text?
5000
Milk (2008-06-14 13:39:00) [11]>Kaer © (14.06.08 13:18)
А что у тебя вEdit1.Text?