Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Ayuda con Insercion lentisima en SQLite3 (https://www.clubdelphi.com/foros/showthread.php?t=77370)

fide_uci 19-01-2012 01:09:48

Ayuda con Insercion lentisima en SQLite3
 
Hola amigos, gracias por leer el post. Me encuentro desarrollando una aplicacion para el envio de correos y estoy ahora programando un asistente de importacion que importa desde un archivo (txt, csv, etc.) hacia la BD. El gran problema es que la insercion esta lentisima. Aqui esta el codigo que he creado. Utilizo Delphi 7, ZeosDB 7 y SQLite3.

Código Delphi [-]
var
  vFile: TStringList;
  vX: Integer;
begin

  JvWizard1.ActivePageIndex := 1;

  //Cargar el archivo e importarlo a la BD
  vFile := TStringList.Create;

  try
    vFile.LoadFromFile(boxArchivoSeleccionado.Text);

    Gauge1.MinValue := 0;
    Gauge1.MaxValue := vFile.Count -1;

    for vX := 0 to vFile.Count -1 do
      begin
        //Aqui mostrar el progreso y meter en la BD !!!

        DataM.tbd_recipients.Insert;
        DataM.tbd_recipientslist.AsInteger := 0;
        DataM.tbd_recipientsname.AsString := '';
        DataM.tbd_recipientsemail.AsString := vFile.Strings[vX];
        DataM.tbd_recipients.Post;
        Gauge1.Progress := vX;
        Application.ProcessMessages;
      end;

      ShowMessage(Format('Se han importado %d correos de forma satisfactória.', [vFile.Count]));
  finally
    vFile.Free;
  end;

Por lo que estuve mirando SQLite es rapido cuando se agrupan las inserciones o sea que yo deberia hacer una consulta INSERT y agregar todos los valores pero tengo miedo pasarme y explotar la memoria de la PC.

Por favor ayuda los que conocen del tema a ver de que forma puedo insertar rapido y seguro muchos registros en SQLite 3.

Casimiro Notevi 19-01-2012 01:30:32

Para empezar, quita ese:
Código Delphi [-]
Application.ProcessMessages;

mamcx 19-01-2012 02:31:28

Cita:

Empezado por fide_uci (Mensaje 423277)
Por lo que estuve mirando SQLite es rapido cuando se agrupan las inserciones o sea que yo deberia hacer una consulta INSERT y agregar todos los valores pero tengo miedo pasarme y explotar la memoria de la PC.

Sqlite, al igual que la mayoría de las BD, opera en batch de forma mas eficiente si se agrupa en una transaccion:

http://www.sqlite.org/faq.html#q19


Y en el caso de sqlite, es crucial hacer las operaciones CRUD que afecten muchos registros - exceptuando SELECT - en una transacción, ya que esta BD bloquea TODO EL ARCHIVO cuando se actualiza (otros motores bloquean solo la pagina, la tabla o el registro).


Y quitar Application.ProcessMessages no afectara el desempeño de forma importante, mientras evitara que parezca "muerta" la app.

Sin embargo, de ser una insercion realmente inmensa, es mejor usar un proceso asincronico o meterlo dentro de un thread separado (debes tomar en cuenta las limitaciones y configuraciones para acceder multi-thread sqlite http://www.sqlite.org/threadsafe.html)

fide_uci 19-01-2012 03:35:27

Entonces que solución le ves?. En la aplicación que estoy desarrollando se van a importar millones de registros o sea de lineas con correos para la BD.
Que me recomendarias hacer entonces una transaccion completade 100 en 100 o algo asi no c dime a ver que no se me ocurre nada ahora?

fide_uci 19-01-2012 03:55:52

Amigos mis disculpas si me estaba funcionando bien y super rapido pero el problema era que donde yo tenia

Código Delphi [-]
DataM.tbd_recipientslist.AsInteger := 0;

era := 1; ajjajajja !


La franja horaria es GMT +2. Ahora son las 05:28:36.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi