Estoy trabajando en un sistema que requiere un alto rendimiento de E/S de archivos (con C#). Básicamente, estoy llenando archivos de gran tamaño (~ 100MB) desde el inicio del archivo hasta el final del archivo. Cada ~ 5 segundos estoy agregando ~ 5MB al archivo (secuencialmente desde el inicio del archivo), en cada volumen que estoy descargando la secuencia. Cada pocos minutos necesito actualizar una estructura que escribo al final del archivo (algún tipo de metadato).Escribiendo al final del archivo
Al enjuagar cada uno de los bulks no tengo ningún problema de rendimiento. Sin embargo, cuando actualizo los metadatos al final del archivo obtengo un rendimiento realmente bajo. Supongo que al crear el archivo (que también debe hacerse extra rápido), el archivo realmente no asigna los 100MB completos en el disco y cuando limpie los metadatos debe asignar todo el espacio hasta el final del archivo.
Chicos/Chicas, ¿alguna idea de cómo puedo solucionar este problema?
¡Muchas gracias!
De Comentario:
En general hablando el código es el siguiente, primero se abre el archivo:
m_Stream = new FileStream(filename,
FileMode.CreateNew,
FileAccess.Write,
FileShare.Write, 8192, false);
m_Stream.SetLength(100*1024*1024);
Cada pocos segundos que estoy escribiendo ~ 5 MB.
m_Stream.Seek(m_LastPosition, SeekOrigin.Begin);
m_Stream.Write(buffer, 0, buffer.Length);
m_Stream.Flush();
m_LastPosition += buffer.Length; // HH: guessed the +=
m_Stream.Seek(m_MetaDataSize, SeekOrigin.End);
m_Stream.Write(metadata, 0, metadata.Length);
m_Stream.Flush(); // Takes too long on the first time(~1 sec).
Por favor, muéstranos tu código. – SLaks
¿Quiere decir que asigna previamente los 100 MB y luego comienza a escribir los fragmentos de 5 MB desde la posición 0? Entonces, ¿hay 20 fragmentos máximos? –
Hola Henk, En términos generales, el código es el siguiente (todavía estoy tratando de entender cómo formatear el código).: Primero se abre el archivo: m_Stream = new FileStream (nombre de archivo, FileMode.CreateNew, FileAccess.Write, FileShare.Write, 8192, false); m_Stream.SetLength (100 * 1024 * 1024); Cada pocos segundos estoy escribiendo ~ 5MB. m_Stream.Seek (m_LastPosition, SeekOrigin.Begin); m_Stream.Write (buffer, 0, buffer.Length); m_Stream.Flush(); m_LastPosition _-buffer.Length; m_Stream.Seek (m_MetaDataSize, SeekOrigin.End); m_Stream.Write (metadata, 0, metadata.Length); m_Stream.Flush(); ==> Demasiado tiempo en la primera escritura; –