![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
La estructura es, y si no mal recuerdo el tamaño de los datos
ID Integer 2 bytes Num1 Float 6 bytes Num2 Float 6 bytes Num3 Float 6 bytes Flag String[1] IsNav Boolean 1 byte TimeStamp DateTime 6 bytes Commentarios string[255] Num4 Integer 2 bytes 285 bytes
__________________
eLcHiCoTeMiDo - Rompecorazones profesional Yo no soy presumido; ¿Pero de qué sirve mi humilde opinión contra la de los espejos? Salva a un nylon, usa prendas de piel de foca
|
|
#2
|
||||
|
||||
|
Corrijo lo anterior, considerando que los Int son de 4 bytes y los float de 8 bytes, la suma total para el registro sólo para datos es de 289 bytes, que multiplicados por los 235,000 registros, nos da 67,915,000 bytes en memoria al menos.
El campo Comentarios casi siempre está vacio, de todos estos registros que se insertan, si acaso habrá 200 registros con Comentario de no mas de 50 caracteres de largo. Sigo sin entender, por qué es tan lento el sólo consultar el valor que regresa ChangeCount? Traté de asignar Delta a la propiedad Data de otro ClientDataSet como método alterno y al momento de hacer la asignacion cds2.Data := cds1.Delta tarda muchisimo tiempo.
__________________
eLcHiCoTeMiDo - Rompecorazones profesional Yo no soy presumido; ¿Pero de qué sirve mi humilde opinión contra la de los espejos? Salva a un nylon, usa prendas de piel de foca
|
|
#3
|
||||
|
||||
|
Hola rcarrillom.
Hice una prueba con un TClientDataSet en memoria cargándolo de forma aleatoria: Y, si bién la carga inicial tarda dada la cantidad de registros, la respuesta de la propiedad ChangeCount en Button1Click es instantánea. No sé si se me esté pasando algo por alto o si habré interpretado mal la situación... Saludos ![]()
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
|
#4
|
||||
|
||||
|
Gracias ecfisa, el escenario general es este, se generan varios archivos Access con la misma estructura por una aplicacion antigua cuyo contenido es un registro de entrada de un puerto serial, y con mi app leo los registros de todos ellos con ADO y los inserto en el ClientDataSet, llegando hasta 300 mil registros.
La estructura la genero de la siguiente manera:
Y para llenarlo con registros, repito el proceso por cada archivo Access que el usuario seleccione con un diálogo Open con seleccion múltiple, como nota, el campo Comment, el 98% de las veces está vacío:
Al terminar de anexarlos todos, inmediatamente intento leer ya sea el ChangeCount o el Delta y aqui es donde tarda muchisimo tiempo. Es en este punto donde no entiendo el porqué de la tardanza cuando son 235K registros agregados de un solo golpe, si le agrego 17K la respuesta es casi inmediata.
__________________
eLcHiCoTeMiDo - Rompecorazones profesional Yo no soy presumido; ¿Pero de qué sirve mi humilde opinión contra la de los espejos? Salva a un nylon, usa prendas de piel de foca
|
|
#5
|
||||
|
||||
|
Hola Ricardo.
Es extraño (e interesante) lo que comentas. Veré si encuentro una pista en los fuentes de MIDAS (el motor interno de TClientDataSet). Pero tengo una duda: ¿cuál es la razón por la que necesitas usar ChangeCount? Para conocer la cantidad total de registros puedes usar la propiedad RecordCount. ChangeCount, en cambio, te dice cuántas modificaciones (altas, bajas y cambios) hay en la "bitácora de cambios" del conjunto de datos respecto a cómo se encontraba antes de comenzar dichas modificaciones. Si éste último dato no fuera necesario en tu caso, te recomendaría poner la propiedad LogChanges en False antes de comenzar las inserciones y usar la clásica propiedad RecordCount. De esa forma el proceso trabajará más rápido. Un saludo desde el ciber. |
|
#6
|
||||
|
||||
|
Gracias Al, mi app es para edicion de datos numéricos que se despliegan en una gráfica, eliminar picos, suavizar puntos, interpolar datos... El ChangeCount es para saber si se ha modificado el conjunto de datos en cualquier momento y para llevar un registro de cambios para un Deshacer. Si hay otra manera de saber simplemente si el conjunto ha cambiando, es bienvenida.
Tengo implementadas las dos formas que mencionas: 1. Si el usuario inicia el proceso desde cero para agregarle archivos existentes, mi app primero crea un dataset vacio y le deja LogChanges = True. 2. Si el usuario inicia el proceso abriendo un archivo existente, entonces hago LogChanges = False y al terminar de cargar lo vuelvo a poner en True. De aqui en adelante se pueden insertar archivos o agregar manualmente registros individuales. Fusioné 20 archivos que me dan 235K registros y los guardé en uno solo que abro con el método 2 y todo anda perfecto. Para mí es mas sencillo si lanzo operaciones SQL en memoria sobre los datos del ClientDataSet para actualizaciones en masa a través de componentes de terceros (XQuery) y aprovechando las capacidades del ClientDataSet para deshacer operaciones, no lidiar yo mismo con registros y asignacion de memoria, pero si se me complica el asunto con un simple ChangeCount, tendré que replantear la manera de cómo trabajar los datos y usar estructuras y asignacion de bloques de memoria a la vieja escuela. Otro problema grave es que al guardar los datos se hace de manera lentisima, al grado que esos 235K registros se guardan en dos minutos, y el programa viejo que los genera los guarda en menos de 5 segundos, este es tema para otro hilo, sera que no sé cómo optimizar estas escrituras.
__________________
eLcHiCoTeMiDo - Rompecorazones profesional Yo no soy presumido; ¿Pero de qué sirve mi humilde opinión contra la de los espejos? Salva a un nylon, usa prendas de piel de foca
|
|
#7
|
||||
|
||||
|
Hola Ricardo.
No tengo Delphi aquí, pero hace un par de horas revisé el funcionamiento de ChangeCount. Cuando lees esa propiedad se ejecuta un proceso que "empaca" cierta información del caché y si este es muy grande, ChangeCount tardará en responder, tal como describes. Tal vez haya otra forma de controlar ese dato. En los próximos días estudiaré con detenimiento lo que comentas en tu último mensaje, para ver de qué manera se puede solucionar el problema. Mientras tanto, si pudieras ampliar los detalles del caso, mucho mejor, para que todos lo comprendamos bien. Un cordial saludo. Al. ![]() |
|
#8
|
||||
|
||||
|
No hay mas detalles Al, para depurar bien, activé la opcion Use debug dcus y no me lleva muy lejos, al llegar a la llamada cdsLog.ChangeCount me lleva a la unit Datasnap.DBClient(2669):
y ésta llamada me dirije a la unit Datasnap.DSIntf(662);
De ahi ya me pide el archivo ds.cpp que no está en mi sistema y ahi ya sale la ventana de CPU. Por el momento he llegado hasta aqui con el código fuente. Si al CDS le agrego los archivos de un solo golpe el tiempo de consuta a ChangeCount es grande, si lo hago uno por uno, el tiempo se incrementa progresivamente con cada archivo agregado al DS. Espero que alguien tenga más código fuente que yo, sé que las distintas versiones de Delphi vienen o no con fuentes dependiendo de lo caro que costó ![]()
__________________
eLcHiCoTeMiDo - Rompecorazones profesional Yo no soy presumido; ¿Pero de qué sirve mi humilde opinión contra la de los espejos? Salva a un nylon, usa prendas de piel de foca
|
|
#9
|
||||
|
||||
|
Hola Ricardo, ya nos contarás cómo va.
Cita:
Un saludo. |
|
#10
|
||||
|
||||
|
Cita:
Si así es, cuando realizo cargas muy pesadas en memoria, acostumbro a usarlo con ese fin. En realidad estuve a punto de proponer el uso al menos luego de la carga de cada archivo Access (suponiendo que no serían significativos los cambios provocados por la carga), pero pensé que luego del mensaje había sido probado sin efecto. Saludos ![]()
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... Última edición por ecfisa fecha: 07-06-2014 a las 04:18:36. |
|
#11
|
|||
|
|||
|
Lentitud cambio de control
Hola,
que pasa si: agrego un campo(cambiado) 1 =cambiado 0 sin cambios y este es el indice cargo los registros viejo sin log de cambio cargo los registros nuevos sin log de cambios cuento log registros cambiados usando el indice nuevo por campo cambiado el usuario cambia un dato entonces cambio el cambio cambiado de 0 a 1 o lo dejo en 1 si fue cambiado previamente cuanto registros cuanto demora? la creacion de un indice al vuelo es casi inmmediato |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Lentitud con ClientDataSet.XMLData en Servicio Datasnap | code88 | Varios | 4 | 08-02-2013 18:43:07 |
| buscar registros de un ClientDataSet a otro clientDataSet | novato_erick | Conexión con bases de datos | 2 | 02-02-2013 20:48:09 |
| Lentitud leer .csv | ErYcK | C++ Builder | 23 | 05-07-2012 22:56:44 |
| Lentitud en la red. | Carlos Arevalo | Varios | 2 | 09-07-2007 19:04:08 |
| Modificar propiedad Delta de CDS | alucardo | Conexión con bases de datos | 0 | 04-10-2006 19:36:41 |
|