Главная страница
    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-1211599399
azamatufa
2008-05-24 07:23
2008.07.13
Поделитесь примером Delphi 7 + FB.


8-1183039452
wind1
2007-06-28 18:04
2008.07.13
Отображение .avi файлов


2-1213453411
cr@nk
2008-06-14 18:23
2008.07.13
Помогите с задачей по множествам


15-1211813808
БарЛог
2008-05-26 18:56
2008.07.13
php. случайный элемент числового множества


3-1201774049
Галинка
2008-01-31 13:07
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский