Newsgroup: it.comp.lang.delphi
Titolo: Delphi5 .. Errore Out of Memory

Salve a tutti.... Come da oggetto sto eseguendo una migrazione di dati da un 
db in access ad uno interbase...
Il problema mi si presenta dopo svariate tabelle esaminate ed importate
Quella in questione e' composta di 15.000 record... al 8millessimo ( a 
caso ) il programma si blocca...
In vista da errore... si blocca e non dice niente...
In XP invece ( x fortuna ) segnala l'errore out of memory...
Ho provato a disconnettere e riconnettere il db interbase ogni 1000 record 
scritti... ho messo un warning in caso di disconnessione del db ( magari il 
tanto tempo che rimane attivo anche se sono bene che nn e' possibile ) ....
Ho cercato su internet ma ovviamente non ho trovato niente a parte qualcosa 
che parlava di memoria virtuale di windows ( cosa che ovviamente in entrambi 
i sistemi e' settata di default .. mai toccata )
Avete qualche idea in merito 

 Avete qualche idea in merito
come fai la migrazione ? forse lasci qualche memory leak e dopo nmila 
record la memoria si intasa ...
^_Goblin_^
-- 
Ibis et redibis non morieris in bello
http://goblinland.myminicity.com/

 In XP invece ( x fortuna ) segnala l'errore out of memory...
..si..ok...pero, amico mio, non stai dicendo un cazzo, giusto?
Cosa usi per l'accesso ai dati? bde o ado??
Usi oggetti tabella o oggetti query?
Il server interbase è il pc su cui gira il tuo programma?
Hai controllato se ci sono dei memory leak?
Quanto spazio libero su disco hanno i pc coinvolti?
A.


Allora...................
Per scrivere i dati nel gdb uso un componente che sfruttando la connessione 
ado utilizza i driver interbase ( si chiama LCPI_IBProvider ) quindi senza 
bde
Utilizzo sempre e solo tquery
La migrazione e' locale sul mio pc quindi il server ib e' installato qua
Spazio libero su disco? tera.... al momento il gdb arriva a 15mb mentre il 
db access e' 50mb
Vi passo un po' di codice... non si sa mai :-)
      QY_Register.First;
      While Not QY_Register.Eof Do
      Begin
         Label1.Caption := 'Aggiunta Informazioni, Tabella ' + 
QY_RegisterTabella_Nome.AsString;
         QY_MDB.Close;
         QY_MDB.SQL.Clear;
         QY_MDB.SQL.Add('Select * From ' + QY_RegisterTabella_Nome.AsString 
+ ' Order BY ID');
         QY_MDB.Open;
         QY_GDB.Close;
         QY_GDB.SQL.Clear;
         QY_GDB.SQL.Add('Delete From ' + QY_RegisterTabella_Nome.AsString);
         QY_GDB.ExecSQL;
         QY_GDB.Close;
         QY_GDB.SQL.Clear;
         QY_GDB.SQL.Add('Select * From ' + 
QY_RegisterTabella_Nome.AsString);
         QY_GDB.Open;
         ProgressBar1.Min       := 0;
         ProgressBar1.Position  := 0;
         ProgressBar1.Max       := QY_MDB.RecordCount;
         Application.ProcessMessages;
         Screen.Cursor          := crHourGlass;
         While Not QY_MDB.Eof Do
         Begin
            ///If ((Int(ProgressBar1.Position / 1000)) * 1000) = 
ProgressBar1.Position Then
            Label3.Caption      := IntToStr(ProgressBar1.Position);
            Label2.Caption      := IntToStr(ProgressBar1.Max-1);
            QY_Temp.Close;
            QY_Temp.SQL.Clear;
            QY_Temp.SQL.Add('Select * From ' + 
QY_RegisterTabella_Nome.AsString + ' Where ID = "AA"');
            QY_Temp.Open;
            QY_GDB.Append;
            For I := 0 To (QY_MDB.FieldCount-1) Do
            Begin
               sValore  := '';
               nValore  := 0;
               sTemp    := QY_MDB.Fields[I].DisplayName;
               sDir     := Copy(QY_MDB.Fields[I].DisplayName,1,31);
               If QY_MDB['ID']  <> NULL Then Label4.Caption   := 
QY_MDB['ID'];
               Label5.Caption   := sTemp;
               Application.ProcessMessages;
               QY_GDB.Edit;
               QY_GDB[sDir] := QY_MDB[sTemp]
               Try
                  QY_GDB.Post;
               Except
                  Label4.Caption   := 'Scrittura ERRORE';
                  Application.ProcessMessages;
                  sErrori.Add(QY_MDB['ID'] + ' ' + 
QY_RegisterTabella_Nome.AsString);
                  sErrori.SaveToFile('Errori_Migrazione.TXT');
               End;
            QY_MDB.Next;
            ProgressBar1.StepIt;
         End;
         QY_Register.Next;
      End;
 

          Application.ProcessMessages;
Dovresti farla ogni n records e non ogni volta.
Usare ProcessMessages per aggiornare una label è una FOLLIA.
Questo è un estratto (indovina di cosa) che ti da una buona idea di
come evitare ProcessMessages per queste cose:
Delphi syntax:
procedure Repaint;
C++ syntax:
virtual void __fastcall Repaint(void);
Description
Call Repaint to force the ****************control to repaint its image
immediately**********.
If the ControlStyle property includes csOpaque, the control paints
itself directly. Otherwise, the Repaint method calls the Invalidate
method and then the Update method so that any visible portions of
controls beneath the control will be repainted as well.
A parte tutto cio, hai mescolato logica e interfaccia utente.
L'aggiornamento della gui dovrebbe essere portato FUORI ed eseguito
tramite una callabck.
Infine, cosi a occhio non vedo cose strane che potrebbero provocare
l'errore che ti ritrovi.
Ti suggertisco di fare un test usando qualcosa di diverso da
LCPI_IBProvider.
Ad esempio, ado via odbc o ibx.
Io sto coso non l'ho mai visto, sentito o usato: sono sempre andato
via ibx.
A.


Tquery sfruttando la connessione ado che si interfaccia al driver ib
application.process mi serviva x sapere cosa sta succedendo... li ho 
aggiunti qua e la x cercare d capire dove si creava il problema
sul discorso del recordcount devo darti ragione :-( 

 aggiunti qua e la x cercare d capire dove si creava il problema
Abituati a lavorare come si deve, anche in cose spot:
Type
  TExportDataCallBack = procedure(sender: TOBject; const
ATotalRowCount, ACurrentRowIndex: integer; const AInfo: string; var
AStopOperation: boolean) of object;
      QY_Register.First;
      While Not QY_Register.Eof Do
      Begin
**         if (Assigned(CallBack)) then
**           CallBack(self, 0,0,  'Aggiunta Informazioni, Tabella ' +
Y_RegisterTabella_Nome.AsString, aStop);
             if (AStop) then
                     break;
        .....
         QY_MDB.Close;
         QY_MDB.SQL.Clear;
         // lancio una select count e metto il valore in
totalrowcount...
         if (Assigned(CallBack)) then
           CallBack(self, TotalRowCount,0,  ' ', aStop);
         While Not QY_MDB.Eof Do
         Begin
         if (Assigned(CallBack)) then
         begin
           inc(RowCounter);
           CallBack(self, TotalRowCount, RowCounter,  ' ', aStop);
         end;
A.

 ha scritto nel messaggio 
news:79af7def-613c-4a37...@p36g2000vbn.googlegroups.com...


 dici che devo passare via bde? blheeeeeeeeee
dico che devi provare a fare la stessa cosa che fai ora senza usare
quel coso strano di cui non ho mai sentito parlare.
se poi usi d7, puoi provare dbx....
A.

Mabi ha scritto:

Non puo' essere un Field mancante nel DB destinazione, oppure un Field 
scritto in maniera diversa? io userei un FindField prima di copiare, cmq 
potresti spostare il try sotto il for del FieldCount e nell'except 
gestire, anche sommariamente, l'eventuale errore:
  For I := 0 To (QY_MDB.FieldCount-1) Do
  Begin
    Try
    .....
    Except
      on E: Exception do
          ShowMessage(E.Message);
    end;
  end;


Sicuramente una try messa cos� sarebbe piu' esaustiva...
Sul discorso del campo non credo... perche' da errore out of memory dopo 
3000 record di 15000  inseriti in una tadoquery
"^_Goblin_^" <^__^Nic_^__^sab_^__^@^__^Libero_^__^.it> ha scritto nel 
messaggio news:8HGum.42001$Tq6....@tornado.fastwebnet.it...


 
Prima di fare il travaso non converebbe aggiungere un campo "contatore 
incrementale" tipo primary key ed usare poi questo per la scrollbox 
durante il travaso?
Ciao giorgio