Foros del Web » Programación para mayores de 30 ;) » .NET »

Lectura ficheros pesados - Caché

Estas en el tema de Lectura ficheros pesados - Caché en el foro de .NET en Foros del Web. Buenas a todos, Tengo la siguiente duda: Resulta que estoy trabajando en un proyecto en el que tengo que leer ficheros de texto con volumenes ...
  #1 (permalink)  
Antiguo 08/03/2010, 10:20
 
Fecha de Ingreso: marzo-2010
Mensajes: 9
Antigüedad: 14 años, 1 mes
Puntos: 0
Pregunta Lectura ficheros pesados - Caché

Buenas a todos,

Tengo la siguiente duda:

Resulta que estoy trabajando en un proyecto en el que tengo que leer ficheros de texto con volumenes de datos bastante grandes 4-8GB y tengo duda sobre la consumición de la caché.

Usualmente se crea un buffer en la apertura de un fichero y hasta que no ha sido leido no se libera ese buffer. Esto qué significa ¿qué el buffer consume tanta memoria caché como el tamaño del fichero? ¿es viable leer ficheros tan grandes?

Espero que podáis ayudarme. Un saludo y muchas gracias.
  #2 (permalink)  
Antiguo 08/03/2010, 14:28
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 2 meses
Puntos: 50
Respuesta: Lectura ficheros pesados - Caché

Yo lo que hago es efectivamente trabajar con un buffer y conforme se vaya llenando realizo otra petición para incrementar el tamaño, te paso la función que utilizo

Código PHP:
 private static int _bufferSize 16384;
        
/// <summary>
        /// Lee el contenido de un archivo
        /// </summary>
        /// <param name="filename">Nobre archivo</param>
        /// <returns>Contenido archivo</returns>
        
public static string GetContentFile(string filename)
        {
            if (!
File.Exists(filename))
                return 
string.Empty;

            
StringBuilder stringBuilder = new StringBuilder();
            
FileStream fileStream = new FileStream(filenameFileMode.OpenFileAccess.Read);

            
using (StreamReader streamReader = new StreamReader(fileStream))
            {
                
char[] fileContents = new char[_bufferSize];
                
int charsRead streamReader.Read(fileContents0_bufferSize);

                if (
charsRead == 0)
                    return 
string.Empty;

                while (
charsRead 0)
                {
                    
stringBuilder.Append(fileContents);
                    
charsRead streamReader.Read(fileContents0_bufferSize);
                }
            }

            return 
stringBuilder.ToString();

        } 
La variable _bufferSize es la que tendrás que modificar (si quieres) con un tamaño mayor para tener una reserva inicial siempre, pero independiente a eso el code que puse te debe funcionar sin problemas

Saludos
__________________
Nadie roba nada ya que en la vida todo se paga . . .

Exentrit - Soluciones SharePoint & Net
  #3 (permalink)  
Antiguo 09/03/2010, 02:14
 
Fecha de Ingreso: marzo-2010
Mensajes: 9
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Lectura ficheros pesados - Caché

Gracias por responder, Rootk

Entonces ¿el tamaño del fichero no es ningún problema? Por que el tema está en no sobrepasar el límite de la caché en el proceso ¿lo ves viable? No tengo claro como se consume la caché en este tipo de procesos.

Un saludo y gracias de nuevo.

Última edición por Rikku1010; 09/03/2010 a las 02:16 Razón: add
  #4 (permalink)  
Antiguo 17/03/2010, 20:42
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 2 meses
Puntos: 50
Respuesta: Lectura ficheros pesados - Caché

Cita:
¿lo ves viable? No tengo claro como se consume la caché en este tipo de procesos.
Mira, el código que puse hace reservas de memoria conforme se va llenando el buffer, independientemente a eso me gustaría saber que es lo que pretendes hacer con la lectura de un archivo de 4 a 8gb, ¿que es lo que se está guardando en ese archivo o porque lo tienes que leer de ese tamaño? ¿hay forma de que el proceso que lo genere haga particiones del archivo?
  #5 (permalink)  
Antiguo 05/04/2010, 04:48
 
Fecha de Ingreso: marzo-2010
Mensajes: 9
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Lectura ficheros pesados - Caché

Gracias de nuevo por tu dedicación, Rootk

Te comento:

Ese archivo es generado por un sistema externo que genera gran cantidad de datos cada poco tiempo, por esa razón es tan pesado el fichero. Al provenir de un sistema externo no puedo intervenir ni en el formato, tamaño ni ningún otro aspecto del proceso de generación del archivo.

El contenido es una serie de datos clasificados por columnas (o separadores) cuya finalidad es que sean volcados en una base de datos para su posterior explotación.

De ahí mi duda. Si el fichero tiene ese volumen de datos, y si el buffer no se libera hasta que este haya sido leido completamente ¿quiere decir que el tamaño del buffer debe ser igual al tamaño del archivo? Si es así es inviable por limitaciones de la caché. A no ser que por detrás lo realice de otra forma y vaya liberando cache mientras avanza en la lectura del fichero. Esa es mi gran duda.

Si veo que estoy limitada por temas de caché, creo que lo más conveniente será el uso de DTS para realizar el volcado de datos.
  #6 (permalink)  
Antiguo 06/04/2010, 11:32
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 2 meses
Puntos: 50
Respuesta: Lectura ficheros pesados - Caché

Cita:
creo que lo más conveniente será el uso de DTS para realizar el volcado de datos.
Tienes sql server 2005?? si es así y el sistema externo deposita archivos en un lugar determinado porque no creas un ETL (integration services) para que se encargue de hacer ese trabajo? inclusive el ETL lo puede colocar en el agente o si es el caso lo puedes llamar desde la aplicación, ¿me explico?
__________________
Nadie roba nada ya que en la vida todo se paga . . .

Exentrit - Soluciones SharePoint & Net
  #7 (permalink)  
Antiguo 07/04/2010, 10:02
 
Fecha de Ingreso: marzo-2010
Mensajes: 9
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Lectura ficheros pesados - Caché

La verdad es que sí que había pensado en usar DTS o SSIS (según tengo entendido el paquete ETL se crea desde SSIS) el problema es que no todas las versiones de SQL Server la tienen (solo las más avanzadas y requieren licencia). El tema es que no sé si cuento con licencia y me veo más limitada.

Otra posibilidad que estoy barajando es usar un BULK INSERT mediante un procedimiento almacenado para realizar el volcado porque, según tengo entendido, es una de las formas más óptimas y al fin y al cabo los servicios de integración seguramente es lo que estén realizado por debajo.

De momento intento descubrir cómo funciona el famoso BULK INSERT y he abierto el siguiente hilo tras no tener mucho éxito con mis búsquedas por la red:

http://www.forosdelweb.com/f87/bulk-insert-espeficar-campos-795027/

Gracias de nuevo por la ayuda, siempre me es útil :)

Etiquetas: ficheros, lectura
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:59.