Pregunta

Estamos creando un sitio ASP.NET MVC que necesitará almacenar más de 1 millón de imágenes, de alrededor de 2K-5K de tamaño. Desde la investigación anterior, parece que un servidor de archivos probablemente sea mejor que un DB (no dude en comentar lo contrario).

¿Hay algo especial a tener en cuenta al almacenar estos muchos archivos? ¿Hay algún problema con Windows que pueda encontrar la foto rápidamente si hay tantos archivos en una carpeta? ¿Se debe crear una estructura de directorio segmentada, por ejemplo, dividiéndolos por nombre de archivo? Sería bueno si la solución escala a al menos 10 millones de imágenes para posibles necesidades de expansión futuras.

¿Fue útil?

Solución

4KB es el tamaño predeterminado del clúster para NTFS. Puede sintonizar esta configuración dependiendo del tamaño de imagen habitual.http://support.microsoft.com/kb/314878

Construiría un árbol con subdirectorios para poder moverse de un FS a otro: ¿Cuántos archivos puedo poner en un directorio?y evite algunos problemas: http://www.frank4dd.com/howto/various/maxfiles-per-dir.htm

También puede tener archivos que contienen imágenes asociadas para cargarlas con solo un archivo abierto. Los archivos de las tos se pueden comprimir si el cuello de botella es E/S, sin comprimir si es CPU.

Un DB es más fácil de mantener pero más lento ... ¡así que depende de usted!

Otros consejos

Ver también esta pregunta de falla del servidor Para alguna discusión sobre las estructuras de directorio.

El problema no es que el sistema de archivos no pueda almacenar tantos archivos en un directorio, sino que si desea acceder a ese directorio usando Windows Explorer, tomará una eternidad, por lo que si alguna vez necesite acceder manualmente a esa carpeta, debe segmento Es, por ejemplo, con un directorio por cada 2-3 primeras letras/números del nombre o incluso una estructura más profunda.

Si pudiera dividir eso en carpetas 1K con archivos 1K, cada uno será más que suficiente y el código para hacerlo es bastante simple.

Suponiendo que NTFS, hay un límite de 4 mil millones de archivos por volumen (2^32 - 1). Ese es el límite total para todas las carpetas en el volumen (incluidos los archivos del sistema operativo, etc.)

Grandes números de archivos en una sola carpeta no deben ser un problema; NTFS usa un árbol B+ para recuperación rápida. Microsoft recomienda que deshabilite la generación de nombres de cortes cortos (la característica que le permite recuperar mypictureOfyou.html como mypic ~ 1.htm).

No sé si hay alguna ventaja de rendimiento al segmentarlos en múltiples directorios; Supongo que no habría una ventaja, porque NTFS fue diseñado para su rendimiento con grandes directorios.

Si decide segmentarlos en múltiples directorios, use una función hash en el nombre del archivo para obtener el nombre del directorio (en lugar de que el nombre del directorio sea la primera letra del nombre del archivo, por ejemplo, para que cada subdirectorio tenga aproximadamente el mismo número de archivos.

No descartaría el uso de una red de entrega de contenido. Están diseñados para este problema. He tenido mucho éxito con Amazon S3. Dado que está utilizando una solución basada en Microsoft, tal vez Azure podría ser un buen ajuste.

¿Existe algún tipo de requisito que le impida usar una solución de terceros?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top