[ Divjak @ 17.04.2005. 20:27 ] @
Ovo se odnosi na Pascal...
kada radim neki program koji recimo radi sa po dva tri niza od 10 000 elemenata... posle odredjenog vremena kompjuter zna tako da se uspori da jedan obican step over korak traje i po ceo minut...
zasto se ovo desava? zar compiler ne bi trebao da oslobodi memoriju koju je u toku rada koristio?

Kako ovo da izbegnem?
[ Divjak @ 17.04.2005. 21:16 ] @
Problem je bio u tome sto sam niz od 100 000 000 elemenata tipa boolean deklarisao kao globalnu promenljivu (16 MB) a stack mi nije bio toliki pa je doslo do usporavanja, mada ne vidim zasto bi ovo usporavalo ceo sistem?

Jel moze neko da mi objasni zasto boolean zauzima ceo byte a ne samo bit?

Takodje koju data strukturu koristiti kada mi treba ovako nesto znaci zelim da oznacim koje koordinate su prikljucene grafu a koje nisu pa sam to deklarisao kao
Code:

K  : array[1..10000,1..10000] of boolean;

ali ocigledno da to tako ne moze...
[ _v!rus_ @ 18.04.2005. 01:17 ] @
Citat:

K : array[1..10000,1..10000] of boolean

Cudi me da ne prijavljuje overflow...

Anyway, Boolean zaista zauzima jedan bajt memorije, prosto zato sto je bajt osnovna memorijska jedinica, tj. procesor ne moze da adresira manje od jednog bajta @ a time (ali moze vise, 386+ adresiraju cele DWORD-ove). 8086 (TP) arhitektura adresira memoriju sistemom segment:offset (tzv. real-mode), gde su seg i off dvobajtni registri koji definisu memorijsku lokaciju (red. br. bajta) na kome se nalazi podatak za operaciju. Kod TP-a ogranicenje za stat. varijable je jedan mem. segment (znaci ostaje samo offset(dvobajtni) registar koji moze da adresira max. 2^16=64Kb, zato me cudi da ti nema overflow-a). Ne mogu se adresirati bitovi. Ali se mogu pakovati, ali to implementirati za konkretno potrebu koju si naveo je mnogo posla za malu korist.

Delphi (valjda) ima neki svoj sistem pakovanja bitova (valjda je TBitSet, nisam tamo zalazio), mada mozes i da napravis svoj (jedan objekat u TP-u koji ce imati metode za upis i ispis bitova, jednio umesto uglaste koristis obicnu zagradu ;-)
Bitove standardno upisujes sa or-om, testiras sa and-om, clearujes sa xor-om...
(npr. X or RBrBita^2, RbrBita < 8). Naravno, kada jednom napravis taj objekat, mozes ga koristiti u svim ostalim programima... ;-)

Sto se tice nekog grafa koji si pomenuo (koordinate "prikljucene" grafu, ne razumem bas sta to znaci), zar su ti potrebne koordinate *svake* tacke?
Ako nisu, napravi record sa poljima X i Y, napravi matricu tih recorda, i kada treba neku koordinatu da "prikljucis", samo dodaj u matricu.

Pozdrav,
v!rus
[ Toyo @ 18.04.2005. 03:00 ] @
Da prostite, ali mislim da Delphi, zabole k.... za smestanje 8 booleana u 1 bajt.

Sto se tice pakovanja bilo je nesto pre jedno 15 godina tipa: packed array bla bla (a mozda i gresim)

Pozdrav
[ Divjak @ 18.04.2005. 10:35 ] @
Citat:
Cudi me da ne prijavljuje overflow..


radi se o FreePascalu...

Citat:
Sto se tice nekog grafa koji si pomenuo (koordinate "prikljucene" grafu, ne razumem bas sta to znaci), zar su ti potrebne koordinate *svake* tacke?


dobro, ne znam tacno kako se to kaze, ja u skoli jos nisam stigao do grafova...
ja moram u svakom trenutku da znam koja tacka je vec u grafu a koja nije, pretrazivanje je malo sporo za ovo zar ne?
[ morlic @ 18.04.2005. 10:43 ] @
Moguce je da velicina niza (100MB) + ostali programi i windows prelazi fizicku kolicinu memorije koju imas na racunaru, pa se stalno vrsi prebacivanje u swap fajl i nazad. Moras da pronadjes neko "pametnije" resenje za grafove.
[ morlic @ 18.04.2005. 10:48 ] @
Mozes da napravis svoj mehanizam za ustedu memorije pakovanjem 8 tacaka u jedan bajt, sto bi trosilo 100/8 = 12,5MB RAM memorije
[ Divjak @ 18.04.2005. 15:07 ] @
@prva poruka...
ne radi se o tome imam 1GB, a gledao sam negde oko 700 - 800 MB je free kad krenem u debbuging...

@druga poruka...
kako?

A da taj niz smestim u heap? Jel bi moglo tako, nikad to nisam radio...
[ Toyo @ 18.04.2005. 15:45 ] @
Evo ja sam tu nesto kuckao pa mozda ti pomogne:

Pakovanje 8 booleana u 1 bajt.
U proceduri button1click je primer kako se koristi tako spakovan niz.
Sad bi mogao da imas i milijardu booleana spakovanih u milijardu/8 bajtova

Code:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, DBGrids, DB, DBTables, StdCtrls;
const
  bitovi: array[0..7] of byte = (254, 253,251,247,239,223,191, 127);
type
  niz=array [0..100000000] of byte;
  pniz=^niz;
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  P: pniz;
  YDim: Integer;
  Size: Integer;
implementation

{$R *.dfm}

procedure DimBoolean(var p: pniz; X, Y: Integer);
begin
  YDim := Y;
  Size := ((x*y) div 8)+1;
  getmem(p, Size);
  fillchar(p^, Size, 0);
end;

procedure SetBoolean(p:pniz; x,y:integer; value: Boolean);
var
  b,i,j: Integer;
begin
  b := (x*ydim+y);
  i := b div 8;
  j := b mod 8;
  if value then
    p^[i] := p^[i] or (1 shl j)
  else
    p^[i] := p^[i] and bitovi[j];
end;

function GetBoolean(p:pniz; x,y:integer): boolean;
var
  b,i,j: integer;
begin
  b := (x*ydim+y);
  i := b div 8;
  j := b mod 8;
  Result := (p^[i] and (1 shl j)) > 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i, j: integer;
  b:boolean;
begin
  DimBoolean(P,10,10);
  for i := 0 to 9 do
    for j := 0 to 9 do
      SetBoolean(P,i,j, True);
  for i := 0 to 9 do
    for j := 0 to 9 do
      begin
       b:=GetBoolean(P,i,j);
       setboolean(P,i,j,not b);
      end;
  FreeMem(P);
end;

end.
[ morlic @ 18.04.2005. 21:44 ] @
Pa ne znam sta sve ima u FreePascal-u. Delphi ima TBits klasu pomocu koje mozes raditi efikasno sa bitovima.