2009-03-22 14 views
12

Aquí hay algunas preguntas muy buenas sobre la gestión y el almacenamiento de archivos dentro de un proyecto grande.¿Sugerencias para administrar una gran cantidad de archivos?

Storing Images in DB - Yea or Nay?
Would you store binary data in database or in file system?

El primero tiene algunas grandes ideas y en mi proyecto he decidido ir a la ruta del archivo y la ruta no DB.

Un punto importante en contra del uso del sistema de archivos es la copia de seguridad. Pero en nuestro sistema tenemos un excelente plan de respaldo, así que no estoy preocupado por eso.

La siguiente ruta es cómo almacenar los archivos reales. Y he pensado en tener la ubicación de los archivos estática en todo momento y crear un sistema de directorio virtual en el lado de la base de datos. Por lo tanto, los enlaces al archivo no cambian.

El sistema que estoy construyendo tendrá una administración global de archivos para que todos los usuarios tengan acceso a todos los archivos. Pero muchos que han ido la charla ruta de archivo sobre el tamaño del directorio físico (si todos los archivos se encuentran en un directorio por ejemplo)

Así que mi pregunta es, ¿cuáles son algunos consejos o métodos de mejores prácticas en la creación de carpetas para estos archivos estáticos, o si no debería ir a la ruta del directorio virtual en absoluto.

(el proyecto está en la pila LAMP (PHP), si eso ayuda a todos)

+1

tal vez eche un vistazo a: http://stackoverflow.com/questions/191845/how-to-store-images-in-your-filesystem – Jacco

+0

BTW no solo estoy almacenando imágenes, estoy almacenando cualquier tipo. –

+0

pero se aplican los mismos principios/problemas – Jacco

Respuesta

11

Una forma es asignar un número único a cada archivo y utilizarlo para buscar la ubicación del archivo real. Entonces usted usa ese número para distribuir archivos en diferentes directorios en el sistema de archivos. Por ejemplo, podría usar algo como este esquema:

/images/{0}/{1}/{2}

{0}: file_number % 100
{1}: (file_number/100) % 100
{2}: file_number

+0

Tenía algo en mente en realidad, ¿pero seguí pensando cuando los números crecieron para seguir agregando directorios debajo de ellos? También pensé en crear directores a partir de la fecha en que se creó el archivo (o en el mes), pero qué pasa si un mes es muy pesado en los archivos. –

+0

Este método probablemente distribuiría los archivos de manera más uniforme. Fecha-hora tiene la desventaja de tener que almacenar y buscar la fecha. Puede hacer que este método sea escalable montando algunos directorios en un servidor diferente. –

6

Con el fin de evitar la creación de un excesivo número de entradas en un solo directorio, Es posible que desee basar la creación de directorios en partes del nombre del archivo. Por ejemplo, si tiene un archivo llamado d7f5ae9b7c5a.png, puede guardarlo en media/d7/f5/d7f5ae9b7c5a.png. Si sus nombres de archivo son todos hexadecimales, esto restringirá el número de entradas en un único directorio a 256 hasta el nivel final.

+0

¿Funcionan bien para archivos con caracteres o espacios acentuados? Pero probablemente voy a estar desnudando/traduciendo esos personajes, buena sugerencia. –

+0

Si utiliza un hash para el nombre del archivo a continuación, el único lugar en el que los caracteres no ASCII se mostrarán está en la base de datos, y es probable que sea más fácil de manejar en la base de datos que en el sistema de archivos. –

1

lo general adoptar este enfoque:

tiene una variable de configuración global para su aplicación que apunta a la carpeta donde se almacenan los archivos subidos. En su base de datos, almacene las rutas relativas a los archivos (en relación a lo que apunta la variable de configuración).

Así que si un archivo se encuentra en /www/uploads/image.jpg, la configuración varible apunta a/www/carga la fila de la base de datos tiene image.jpg. Esta es una forma flexible que desacopla la estructura de directorios de su sistema de su aplicación.

Además, puede fragmentar el almacenamiento de archivos en los directorios en función de las tablas de la base de datos con las que se relacionan. Supongamos que tiene una tabla user_reports y una tabla user_photos. Usted almacena los archivos que se relacionan con los informes de usuario en/www/uploads/user_reports.Si tiene una gran cantidad de cargas de usuarios, puede implementar la fragmentación aún más. Digamos que un usuario carga un archivo el 20.03.2009, el archivo se llama report.pdf, por lo que lo almacena en /www/uploads/user_reports/2009/03/20/report.pdf.

2
  1. Una imagen del usuario ~ 100kb, así que tiene 10 000 usuarios en la base de datos, cada usuario tendrá en promedio 5 imágenes, por lo que tendrá 5 terabytes DB, y cada salida de la imagen será ejecutada a través de una base de datos y este tráfico DB adicional reducirá el rendimiento general del servidor de BD. ... puede usar el clúster de DB para evitar esto, pero suponga que es costoso

  2. Informe de usuario sobre el error en la base de datos en vivo, (en prueba, todo funciona correctamente), cómo crearía un volcado y descomprimirlo en los desarrolladores ¿máquina? ¿Cuánto tiempo tomará?

  3. En un momento en el que puede decidir poner las imágenes en algún CDN, lo que serán los cambios en el código fuente?

+0

No estoy usando una base de datos para los datos de imagen reales. –

9

Me encontré con este problema hace un tiempo para un sitio web que alojaba una gran cantidad de archivos. Lo que hicimos fue tomar un GUID (que es también el campo de clave principal de un archivo) (por ejemplo BCC46E3F-2F7A-42b1-92CE-DBD6EC6D6301) y almacenar un archivo de la siguiente manera: A/B/C/C/BCC46E3F-2F7A-42b1 -92CE-DBD6EC6D6301/filename.ext

Esto tiene ciertas ventajas:

  • se puede escalar los servidores de archivos a través de múltiples servidores (y asignar directorios específicos para cada uno)
  • Usted no tiene para cambiar el nombre del archivo
  • Sus directorios están garantizados para ser únicos

Espero que esto ayude!

1

No puedo decir mucho acerca de cómo Apache y PHP gestionar archivos, pero puedo decir algo sobre el sistema de archivos ext3. ext3 no parece tener problemas con un gran número de archivos en el mismo directorio. Lo he probado con hasta un millón de archivos. Asegúrese de que la opción dir_index esté habilitada en el sistema de archivos antes de crear los directorios. Puede verificar ejecutando dump2fs y cambiar esta opción ejecutando tune2fs. Agrupar los archivos en un árbol de subdirectorios puede ser útil porque las herramientas de línea de comandos todavía pueden tener problemas para enumerar los contenidos del directorio.

Cuestiones relacionadas