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)
-   -   Guardar en una variable el contenido de 100000 registros obtenidos con ZeosLib (https://www.clubdelphi.com/foros/showthread.php?t=64782)

noob 18-04-2009 18:56:52

Guardar en una variable el contenido de 100000 registros obtenidos con ZeosLib
 
Tengo este código para meter en un AnsiString el contenido de 100000 registros:

Código:

  while not zquery1.Eof do
    begin
      Contenido := Contenido + 'replace into usuario values (';
      for i := 0 to zquery1.Fields.Count - 2 do
        begin
          NombreCampo := zquery1.Fields.Fields[i].FieldName;
          Contenido := Contenido + '"' + StringReplace(zquery1.FieldByName(NombreCampo).AsString, ',', '.', [rfReplaceAll]) + '", ';
        end;
      NombreCampo := zquery1.Fields.Fields[i + 1].FieldName;
      Contenido := Contenido + '"' + StringReplace(zquery1.FieldByName(NombreCampo).AsString, ',', '.', [rfReplaceAll]) + '");';
      zquery1.Next;
    end;

pero me salta la excepción EOutOfMemory.

Utilizo zeoslib para acceder a una base de datos MySQL.

¿Qué hago mal?

ContraVeneno 18-04-2009 19:09:41

¿en un AnsiString? :confused::confused:

Yo creo que sería mejor que los guardaras en un Dataset... un Ttable, TClienteDataset o una tabla en memoria...

¿para que quieres guardar 100,000 registros en una variable?
Tal vez si nos platicas para que quieres hacer eso, a alguien se le pueda ocurrir alguna otra forma que sea más sencilla.

noob 18-04-2009 19:10:55

Para luego enviar dicha información a un cliente.

Esa información ya está guardada en una base de datos, yo quiero sacarla, almacenarla en memoria principal y enviarla a un cliente.

ContraVeneno 18-04-2009 19:14:23

si ya la tienes en la base de datos, ¿para que la quieres guardar en una variable? Puedes obtener los 100,000 registros con un TQuery (dataset), luego generar un archivo de texto, de excel o pdf recorriendo ese TQuery y ya solo mandarías el archivo que generes...

pero repito, ¿para que los quieres guardar en una variable?

noob 18-04-2009 19:17:25

Mando texto plano por sockets TCP, no mando archivos de texto.

ContraVeneno 18-04-2009 19:43:21

Pues supongo que igual podrías recorrer el mismo dataset e ir enviando los datos directo de ahí, vamos, que sigo sin ver la necesidad de guardarlo en una variable. Pero desconozco el tema de sockets, así que estaría adivinando.

habría que esperar a ver si alguien tiene una mejor idea.

nuk3zito 19-04-2009 05:40:38

Siguiendo con tu idea de enviar los datos de esa manera... ¿Por que no envías varios paquetes (registro por registro, dentro del ciclo while) y cuando termines mandas un texto identificador (se me ocurre "EOF", quiensabe por que) para indicarle al receptor que ya terminaste...

Aunque también podrías (yo lo haría) primero crear un archivo xml en el lado del servidor (para que tengas orden en tus datos), guardarlo y después enviarlo. No se me ocurre por que esto no podría funcionar pero tu lo sabes mejor que nosotros.

Suerte en ello.

Neftali [Germán.Estévez] 20-04-2009 09:14:50

Cita:

Empezado por noob (Mensaje 345418)
Para luego enviar dicha información a un cliente.
Esa información ya está guardada en una base de datos, yo quiero sacarla, almacenarla en memoria principal y enviarla a un cliente.

La verdad es que a mi tampoco se me hubiera ocurrido hacerlo así. Comparto la opinión de ContaVeneno de que si ya tienes los datos en una Base de Datos, porqué "desestructurarlos" a un fichero de texto, para luego posteriormente volver a importarlos (que seguramente será lo que vas a hacer).
Yo hubiera optado por exportarlos a algun formato (que siga siendo estructurado y que te facilite luego otros procesos), DBF, MDB, XML,...

Cita:

Empezado por noob (Mensaje 345421)
Mando texto plano por sockets TCP, no mando archivos de texto.

Si lo vas a acabar mandando, creo que con más razón aun. ¿Porqué? Por que si vas a enviar información, lo lógico sería comprimirla; Haz la prueba sencilla de exportar 100.000 registros a un fichero de texto y luego comprimir ese fichero de texto.

PRUEBA: He hecho un sencilla prueba con 10.000 (10% de lo que vas a hacer tú); He exportado a TXT y luego he comprimido a ZIP. El resultado, como era de esperar, es apreciable en el tamaño de los ficheros.



Si finalmente envías la información comprimida (yo lo haría así), entonces no tiene ventajas convertirla a TXT.


La franja horaria es GMT +2. Ahora son las 02:28:53.

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