Ver Mensaje Individual
  #1  
Antiguo 25-01-2017
Camilo Camilo is offline
Miembro
 
Registrado: jun 2007
Posts: 147
Reputación: 17
Camilo Va por buen camino
"Out Of Memory" con clientdataset > 100.000 registros

Estimados y admirados amigos:
Tengo un procedimiento que en teoría recorre una tabla que hoy x hoy tiene mas de 100 mil registros (Mal diseño por supuesto).
Antes de ese numero no daba ningun lio por lo que no consideraba ninguna alternativa. sucede que al intentar grabar un nuevo registro luego de unos 3 segundos sale el error "Out Of Memory".
El copdigo con el que no he tenido problema sino solo hasta ahora que sobre paso un importante numero de registros es el siguiente:
Código Delphi [-]
procedure TFormPersonas.BitBtn7Click(Sender: TObject);
var
  Current_reg, I, vCurrentRepeticion: Integer;
begin
Des;
  CDSProcedimientos.DisableControls;
   try
    Current_reg := 0;
    CDSProcedimientos.First;

    while not CDSProcedimientos.EOF do
    begin
      for I := 0 to CDSProcedimientos.FieldCount - 1 do
      begin
       if ((Pos('CheckBox_', CDSProcedimientos.Fields[i].FieldName) = 0) and
          (Pos('Codigo_', CDSProcedimientos.Fields[i].FieldName) = 0) and
          (Pos('Valor_', CDSProcedimientos.Fields[i].FieldName) = 0) and
          (Pos('Repeticiones_', CDSProcedimientos.Fields[i].FieldName) = 0) and
          (Pos('Abono_', CDSProcedimientos.Fields[i].FieldName) = 0) and
          (Pos('Neto_', CDSProcedimientos.Fields[i].FieldName) = 0) and
          (Pos('Saldo_', CDSProcedimientos.Fields[i].FieldName) = 0) and
          (Pos('Copago_', CDSProcedimientos.Fields[i].FieldName) = 0)) then
        begin
           if CDSProcedimientos.FieldByName('CheckBox_' + vgEntidad)
            .AsBoolean then
          begin
            for vCurrentRepeticion := 1 to CDSProcedimientos.FieldByName
              ('Repeticiones_' + vgEntidad).AsInteger do
            begin
              Inc(Current_reg);
              if Current_reg <> 1 then
                DuplicarDatos(TablePersonas);

              TablePersonas.Edit;
              TablePersonasProcedimiento.AsString := CDSProcedimientos.Fields
                [i].AsString;
              TablePersonasCodigo_Procedimiento.AsInteger :=
                CDSProcedimientos.FieldByName('Codigo_' + vgEntidad).AsInteger;
              TablePersonasValor.AsFloat := CDSProcedimientos.FieldByName
                ('Valor_' + vgEntidad).AsFloat;
              TablePersonasAbono.AsFloat := CDSProcedimientos.FieldByName
                ('Abono_' + vgEntidad).AsFloat;
              TablePersonasSaldo.AsFloat := CDSProcedimientos.FieldByName
                ('Saldo_' + vgEntidad).AsFloat;
              TablePersonasCopago.AsFloat := CDSProcedimientos.FieldByName
                ('Copago_' + vgEntidad).AsFloat;
              TablePersonas.Post;
             end;
          end;
        end;
      end;
      CDSProcedimientos.Next;
    end;
      CDSProcedimientos.Close;
    for I := CDSProcedimientos.FieldCount - 1 downto 0 do
    begin
      CDSProcedimientos.Fields[i].DataSet := nil;
    end;
Luego de muchas horas de busquedas y lecturas y de leer incluso que esto no se ha solucionado o que es mejor cambiar el componente; tambien he visto que se puede solucionar con simplemente cerrar y abrir donde corresponda para liberar la memoria. Lo he intentado sin un positivo. agradezco a Uds alguna sugerencia en la medida de lo posible. Mil gracias.
Responder Con Cita