FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Copiar parte de un TStringList a otro
hola,
necesito adicionar un grupo de lineas de un TStringList al final de otro. es decir, suponiendo que ambos TStringList tienen 100 lineas, quisiera añadir las lineas de la 60 a la 100 del primero al final del segundo. lo he hecho linea a linea pero quisiera saber como hacerlo mas rapido con alguna funcion estilo Add etc. lo he intentado con AddStrings() pero no lo consigo. hay alguna forma de decirle un numero de lineas especificas? pudieran ayudarme? gracias A |
#2
|
||||
|
||||
Anel Hernandez,
Cita:
Pregunto: 1- ¿Tienes un problema concreto con los tiempos de copia? 2- ¿Que versión de Delphi y Windows utiliza tu aplicación?. Revisa este código: El código anterior en Delphi 7 sobre Windows 7 Professional x32, Copia parte de un TStringList a otro utilizando los métodos BeginUpdate y EndUpdate para mejorar el performance de la copia, como se puede ver en la siguiente imagen: Nota: 1- En el tiempo se incluyo la creación y carga de datos de los TStringList para tener un marco referencial de todo el proceso. 2- La muestra de proceso fueron 1000 Strings por cada TStringList. 3- Se copio el 94,10% de los Items de un TStringList a otro (Del 60 al 1000). 4- Los métodos BeginUpdate y EndUpdate mejoraron muy marginalmente el procesamiento de los TStringList, el proceso de por si es muy rápido por lo cual la mejora es apenas evidente. Espero sea útil Nelson. |
#3
|
|||
|
|||
gracias Nelson,
si tengo problemas con los tiempos. Trabajo con ficheros meteorologicos de varios gigas y decenas de miles de lineas. Son ficheros texto de varios megas. Pueden llegar a 700MB. voy a intentar tu ejemplo. muchas gracias |
#4
|
||||
|
||||
Anel Hernandez,
Cita:
Pregunto: ¿Puedes publicar una muestra del fichero meteorológico en cuestión para hacer pruebas?. Espero sea útil Nelson. |
#5
|
|||
|
|||
hola,
de que tamaño desean el fichero? cuantas lineas? gracias Anel |
#6
|
||||
|
||||
Anel Hernandez,
Cita:
Te comento: 1- En principio sería suficiente un archivo con las primeras 100 líneas, la idea es poder crear uno con una estructura similar a efectos de prueba. 2- ¿Cual es el mayor y menor tamaño registrado para un archivo meteorológico?, ¿Cual es el tamaño promedio?. 3- Si como se indica en el Msg #3 trabajas con archivos de texto con tamaños en el orden de los GB y decenas de miles de registros, es conveniente analizar formas alternas de manejo de la data, por ejemplo por medio de una BD, ¿Podrías explicar un poco el proceso de generación, carga y procesamiento de la información meteorológica en cuestión?. En resumen : No es conveniente manejar tal cantidad de datos en memoria, el problema no son los TStringList es el volumen de la data. Espero sea útil Nelson. Última edición por nlsgarcia fecha: 01-07-2015 a las 07:43:26. |
#7
|
|||
|
|||
Hola,
esta ultima variante calcula un poco mas lento. pocos milisegundos de diferencia. ahora el problema esta cuando utilizo ficheros mas grandes. estoy trabajando con 4 ficieros de 228MB cada uno. Con 4 355 891 lineas cada uno. y me da error "out of memory" en la linea:
solo concatena los 3 primeros ficheros. en el 4 explota. la pregunta: el problema es de RAM o de Delphi? alguna alternativa para concatenar archivos tan grandes? gracias A |
#8
|
||||
|
||||
si estas usando el codigo de daniel, la variable s es un string, los string (que es un alias de UnicodeString) en delphi si mal no recuerdo crecen hasta 2 gb, no sera ahi el problema?
archivos de 200mb no son muy grandes, yo hago la lectura usando el "old pascal i/o" y anda fenomenal, de hecho retroalimento la ui lo cual hace mas lento el procesamiento del archivo pero queda mas lindo Es mas hasta incluso cometo la "estupides" de contar la cantidad de lineas para poder mostrar algo como "procesado x/CantLineas % completado"
El archivo en cuestion tiene casi 200mb y unas 3,3 millones de lineas El proceso de arriba en cuestion, incluyendo el conteo de lineas, el procesamiento interno, el guardado en la BD y teniendo en cuenta que retroalimenta la gui me demora unos 2, 3 min Última edición por AgustinOrtu fecha: 30-10-2015 a las 06:27:16. |
#9
|
||||
|
||||
Hola Anel Hernandez
Como te menciona Agustín cuando los archivos son muy grandes es mas adecuado usar los procedimientos estandar de entrada/salida. El método LoadFromFile de la clase TStrings, carga la totalidad del archivo en la memoria y luego lo divide en líneas, haciendo que se duplique el consumo de memoria y a veces puede provocar fragmentaciónes en la misma. A cada variable de archivo de texto, Delphi le asigna un almacenamiento interno (buffer) de 128 bytes, por lo que usar el procedimiento SetTextBuff para modificar este valor, va a acelerar un poco el proceso. Reproduje la situación con cuatro archivos de 228 Mb en este ejemplo: Con un resultado en mi equipo de 76558319 µs ~ 76,55 s, tiempo mas que razonable. (*): Si deseas que siempre se sobreescriba el archivo destino, reemplaza las lineas entre comentarios por:
Saludos
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... Última edición por ecfisa fecha: 30-10-2015 a las 22:18:43. Razón: sintáxis |
#10
|
|||
|
|||
hola,
estoy corriendo el ejemplo tal cual con 2 ficheros pequeños y con los nombres propuestos y da problemas. no adiciona lineas, sobreescribe a partir de determinadas lineas adicionada comienza a reescribir lineas anteriores. adjunto ficheros de ejemplo (p1.txt, p2.txt, total.txt). sustitui el while por un ciclo de 77 lineas adicionadas y da bien (total77.txt). luego cuando lo intento con 78 da error (total78.txt). llegue a estos numeros por tanteo. cual es el error? gracias A |
#11
|
||||
|
||||
Hola Anel.
En este ejemplo quité todos los ornamentos, genera los 4 archivos de texto, los concatena en otro y muestra el archivo en un memo:
Salida del ejemplo: ;
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Borrar una parte de un TStringList | eennzzoo | C++ Builder | 2 | 28-06-2014 14:04:13 |
copiar el contenido de un TStringList a TSringGrid | GerTorresM | Varios | 1 | 02-07-2010 18:38:41 |
copiar la parte seleccionada de un imagen | fasthorse | C++ Builder | 4 | 14-05-2008 20:05:03 |
Copiar parte de la pantalla.... | craven | Gráficos | 2 | 27-08-2003 22:53:01 |
Copiar Parte de un BMP a otro | craven | API de Windows | 1 | 07-07-2003 10:45:34 |
|