2010-05-16 18 views
6

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). 
+0

Por favor, muéstranos tu código. – SLaks

+0

¿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? –

+0

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; –

Respuesta

2

como se sugirió anteriormente podría no tener sentido (suponiendo que debe tener los metadatos al final del archivo) escribir que en primer lugar.

Eso sería hacer 2 cosas (suponiendo un archivo que no sea escasa) ... 1. asignar el espacio total para todo el archivo 2. realizar cualquier operación de escritura siguiendo un poco más rápido que el espacio está listo y esperando.

¿No puedes hacer esto asincrónicamente? Al menos la aplicación puede pasar a otras cosas.

0

¿Has probado el método AppendAllText?

+0

Muchas gracias por las respuestas rápidas. Tenía miedo de obtener estas respuestas :-) Mover los metadatos a cualquier otro lugar que no sea el final del archivo es problemático, pero parece que no tengo otra opción. Muchas gracias a la gente –

+0

¿Por qué llamas Flush()? ¿Qué esperas ganar al hacerlo? – Stewart

0

Su pregunta no está del todo clara, pero supongo que crea un archivo, escribe 5MB, luego busca 100MB y escribe los metadatos, luego busca de nuevo a 5MB y escribe otros 5MB, y así sucesivamente.

Si ese es el caso, este es un problema del sistema de archivos. Cuando extiende el archivo, NTFS tiene que llenar el vacío con algo. Como dices, el archivo no se asigna hasta que escribes en él. La primera vez que escribe los metadatos, el archivo tiene solo 5 MB de longitud, de modo que cuando escribe los metadatos, NTFS debe asignar y escribir 95 MB de ceros antes de escribir los metadatos. Curiosamente, creo que también lo hace de forma síncrona, por lo que ni siquiera gana con IO superpuesto.

+0

Incorrecto, el FS no tiene que "escribir" nada en el medio. –

+0

¿Estás seguro de eso? NTFS definitivamente admite archivos dispersos, pero no los usa de manera predeterminada y necesita privilegios especiales del sistema operativo para habilitarlos. Esto sugeriría que los 95MB de archivos no utilizados realmente necesitan ser asignados y puestos a cero. – Stewart

Cuestiones relacionadas