Duas coisas: 1) Carrega o texto todo em um TStringList e navega nele, ao invés de navegar fazendo esse lance de abrir/percorrer/fechar. Daí, percorre só o TStringList. Fica mais rápido.
2) Não faz esse lance de post! Vai comer mais memória mesmo, pq as atualizações vão ficar todas na estação. O ideal mesmo é abrir uma transação, emitir explicitamente os INSERTs/DELETEs/UPDATEs no banco e depois, comitar ou cancelar a transação caso esta dê problema. Com isso tudo, vai ficar uma bala! Sds. ________________________________ To: delphi-br@yahoogrupos.com.br From: [EMAIL PROTECTED] Date: Thu, 14 Feb 2008 11:27:06 -0800 Subject: Res: [delphi-br] Leitura de arquivo texto O que vc pode fazer é a cada 50 registros por exemplo gravar o arquivo fisicamente no banco e continuar exportando. Sempre que gravar os arquivos fisicamente feche e abra a tabela de novo, mas sem registros ... ----- Mensagem original ---- De: auriston.delphi <[EMAIL PROTECTED]> Para: delphi-br@yahoogrupos.com.br Enviadas: Quinta-feira, 14 de Fevereiro de 2008 15:51:32 Assunto: [delphi-br] Leitura de arquivo texto Quando efetuo uma leitura de um arquivo texto para gravar o banco de dados esta dando a mensagem OUT OF MEMORY, eu uso a rotina abaixo: AssignFile(Nomearqu ivo, OpenDialog1. FileName) ; Screen.Cursor := crSQLWait; ProgressBar1. Min := 0; ProgressBar1. Max := Tilinha; Reset(Nomearquivo) ; dm.qrytemp.DisableC ontrols; while not Eoln(Nomearquivo) do begin Form1.Caption := Copy(Entrada, 1,126); inc(ilinha); Readln(Nomearquivo, Entrada); if Copy(Entrada, 1,2) <> '90' then Begin dm.qrytemp.Insert; dm.qrytemp.FieldByn ame('MAQUINA' ).Value := 0; dm.qrytemp.FieldByN ame('linha' ).AsString := Copy (Entrada,1,126) ; if Copy(Entrada, 1,2) = '50' then Begin dm.qrytemp.FieldByn ame ('CNPJ').Asstring := Copy(Entrada, 3,14); dm.qrytemp.FieldByn ame ('NOTA').Asstring := Copy(Entrada, 46,6); End; if Copy(Entrada, 1,2) = '53' then Begin dm.qrytemp.FieldByn ame ('CNPJ').Asstring := Copy(Entrada, 3,14); dm.qrytemp.FieldByn ame ('NOTA').Asstring := Copy(Entrada, 46,6); End; if Copy(Entrada, 1,2) = '54' then Begin dm.qrytemp.FieldByn ame ('CNPJ').Asstring := Copy(Entrada, 3,14); dm.qrytemp.FieldByn ame ('NOTA').Asstring := Copy(Entrada, 22,6); dm.qrytemp.FieldByn ame ('produto'). Asstring := Copy(Entrada, 38,14); dm.qrytemp.FieldByN ame ('ITEM').AsString := Copy(Entrada, 35,3); End; if Copy(Entrada, 1,2) = '75' then dm.qrytemp.FieldByN ame ('Produto'). AsString := Copy(Entrada, 19,14); dm.qrytemp.Post; End; // ProgressBar1. Position := iLinha; End; dm.qrytemp.EnableCo ntrols; Precsisode um ajuda para otimizar o codigo acima para que ele fique mais leve. Uso D7 + IBX + FIREBIRD 1.5 sds Auriston Abra sua conta no Yahoo! Mail, o único sem limite de espaço para armazenamento! http://br.mail.yahoo.com/ [As partes desta mensagem que não continham texto foram removidas] _________________________________________________________________ Conheça o Windows Live Spaces, a rede de relacionamentos do Messenger! http://www.amigosdomessenger.com.br/