2011-09-06 16 views
5

Mantengo una aplicación que recopila datos de un registrador de datos y los agrega al final de un archivo binario. La naturaleza de este sistema es que el archivo puede crecer pequeños (> 4 gigabytes) pequeños pasos a la vez. Uno de los usuarios de mi aplicación ha visto casos en su partición NTFS donde fallan los intentos de anexar datos. El error se informa como resultado de una llamada a fflush(). Cuando esto sucede, el valor de retorno para GetLastError() es 665 (ERROR_FILE_SYSTEM_LIMITATION). MSDN da la siguiente description de este error¿Qué factores pueden provocar el error 665 de Win32 (limitación del sistema de archivos)?

La operación solicitada no se pudo completar debido a una limitación del sistema de archivos

Una búsqueda de este código de error en Google da resultados relacionados con el servidor SQL con muy grande archivos (decenas de gigabytes) pero, actualmente, nuestro archivo es mucho más pequeño. Este usuario no ha podido hacer que el archivo crezca más allá de 10 gigabytes. Podemos corregir temporalmente la situación cuando hacemos alguna operación (como copiar el archivo) que fuerza algún tipo de reescritura en el sistema de archivos. Desafortunadamente, no estoy seguro de qué es lo que nos pondrá en esta condición en primer lugar. ¿Qué condiciones específicas en un sistema de archivos NTFS pueden llevar a que este error particular sea informado en una llamada a fflush()?

+0

Tal vez [esto] (http://blogs.technet.com/b /mikelag/archive/2011/02/09/how-fragmentation-on-incorrectly-formatted-ntfs-volumes-affects-exchange.aspx) ayuda. Se trata de Exchange, pero tal vez puedas encontrar algo allí. –

+2

http://support.microsoft.com/default.aspx?scid=kb;EN-US;967351 –

Respuesta

9

Parece que ha alcanzado un límite en la fragmentación del archivo. En otras palabras, cada descarga está creando una nueva extensión (fragmento) del archivo y el sistema de archivos está teniendo dificultades para encontrar un lugar donde realizar un seguimiento de la lista de fragmentos. Eso explicaría por qué es útil copiar el archivo: crea un nuevo archivo con menos fragmentos.

Otra cosa que probablemente funcionaría es desfragmentar el archivo (utilizando la utilidad contig de Sysinternals, puede que lo haga mientras está en uso). También puede usar contig para decirle cuántos fragmentos tiene el archivo. Supongo que está en el orden de un millón.

Si tiene que vaciar el archivo con frecuencia y no puede desfragmentarlo, algo que puede hacer es simplemente crear el archivo bastante grande en primer lugar (para asignar el espacio de una sola vez) y luego escribir en bytes sucesivos de el archivo en lugar de anexar

Si eres valiente (y su proceso tiene acceso de administrador), puede desfragmentar el archivo usted mismo con unas cuantas llamadas a la API: http://msdn.microsoft.com/en-us/library/aa363911(v=VS.85).aspx

+0

No estaba al tanto de la utilidad contig y parece ser una herramienta útil. Desafortunadamente, no fue capaz de desfragmentar el archivo. El código de error fue el mismo (665). Aparentemente, contig no puede desfragmentar un archivo que está demasiado fragmentado. –

+0

@Jon: Sí, me temo que tendrías que ejecutar 'contig' * antes * se puso tan grande. ¿Qué dice 'contig -a' sobre tu archivo? – Gabe

+0

contig -a informó que el archivo tenía 77771 fragmentos. Copié el archivo y contig luego informó que el archivo tenía un fragmento. El número de fragmentos reportados parece una especie de límite extraño en el sistema de archivos. ¿Hay algún tipo de límite rígido o hay algún tipo de indirección pasando aquí? –

Cuestiones relacionadas