Recomendaría utilizar un sistema de archivos regular en lugar de bases de datos. Usar el sistema de archivos es más fácil que una base de datos, puedes utilizar herramientas normales para acceder a los archivos, los sistemas de archivos están diseñados para este tipo de uso, etc. NTFS debería funcionar perfectamente como sistema de almacenamiento.
No almacenes la ruta real hacia la base de datos. Es mejor almacenar el número de secuencia de la imagen en la base de datos y tener una función que pueda generar la ruta a partir del número de secuencia. Por ejemplo:
File path = generatePathFromSequenceNumber(sequenceNumber);
Es más fácil de manejar si necesitas cambiar la estructura del directorio de alguna manera. Tal vez necesitas mover las imágenes a una ubicación diferente, tal vez te quedes sin espacio y empieces a almacenar algunas de las imágenes en el disco A y otras en el disco B, etc. Es más fácil cambiar una función que cambiar las rutas en la base de datos.
Yo usaría este tipo de algoritmo para generar la estructura del directorio:
- Primero rellena tu número de secuencia con ceros a la izquierda hasta que tengas al menos una cadena de 12 dígitos. Este es el nombre de tu archivo. Puedes querer añadir un sufijo:
12345
-> 000000012345.jpg
- Luego divide la cadena en bloques de 2 o 3 caracteres donde cada bloque denota un nivel de directorio. Tenga un número fijo de niveles de directorio (por ejemplo, 3):
000000012345
-> 000/000/012
- Almacena el archivo en el directorio generado:
- Así que la ruta completa y el nombre de archivo para el archivo con id de secuencia
123
es 000/000/012/00000000012345.jpg
- Para el archivo con id de secuencia
12345678901234
, la ruta sería 123/456/789/12345678901234.jpg
Algunas cosas a considerar sobre las estructuras de directorios y almacenamiento de archivos:
- El algoritmo anterior te proporciona un sistema donde cada directorio hoja tiene un máximo de 1000 archivos (si tienes menos de un total de 1 000 000 000 000 archivos)
- Puede haber límites en cuántos archivos y subdirectorios puede contener un directorio, por ejemplo, el sistema de archivos ext3 en Linux tiene un límite de 31998 subdirectorios por directorio.
- Las herramientas normales (WinZip, Explorador de Windows, línea de comandos, bash shell, etc.) pueden no funcionar muy bien si tienes un gran número de archivos por directorio (> 1000)
- La estructura del directorio en sí misma ocupará algo de espacio en disco, así que no querrás tener demasiados directorios.
- Con la estructura anterior, siempre podrás encontrar la ruta correcta del archivo de imagen simplemente mirando el nombre del archivo, si llegas a desordenar tus estructuras de directorios.
- Si necesitas acceder a archivos desde varias máquinas, considera compartir los archivos a través de un sistema de archivos de red.
- La estructura del directorio anterior no funcionará si borras muchos archivos. Deja "agujeros" en la estructura del directorio. Pero como no estás eliminando archivos, debería estar bien.
1 votos
¿Están atados a usuarios específicos o son solo genéricos? ¿Están agrupados de alguna manera?
0 votos
Solo genérico. un montón de imágenes generadas por algún equipo técnico. las estoy nombrando incrementalmente de 1 en adelante solo para tener una idea de una referencia de tiempo.
0 votos
¿Cómo se van a utilizar/acceder? ¿A través de una aplicación personalizada o qué?
0 votos
Estoy almacenando en una base de datos la ruta de cada imagen, cuando un usuario desea acceder a ella, la base de datos me proporciona la ruta y luego la cargo desde allí.
0 votos
¿Y qué hay de las limitaciones con respecto al número de archivos almacenados en una sola carpeta y esas cosas?
16 votos
¿Eres tú? i46.tinypic.com/1z55k7q.jpg
1 votos
:)) ¡sí... 1 millón de imágenes porno :))
0 votos
Por pura curiosidad, ¿hay alguna razón convincente para utilizar NTFS en lugar de FAT16 o 32, en términos de rendimiento? Estoy interesado en saber si has realizado alguna prueba de rendimiento en diferentes sistemas de archivos para determinar cuál es el mejor.
0 votos
No se han realizado pruebas de rendimiento. solo quería que esta aplicación funcione y esto es lo que tenía disponible.
0 votos
¿Estás planeando eliminar muchas imágenes? Si es así, ¿existe algún patrón, por ejemplo, eliminar siempre las imágenes más antiguas, eliminar imágenes al azar?
0 votos
En este momento no hay planes de eliminar archivos, nunca. Eliminar archivos antiguos al azar para mantener las carpetas limpias... dudo que haya una distribución equitativa de esta cosa que llamamos "azar"
0 votos
Cómo planeas saber cómo localizar un archivo en particular?
0 votos
Como alguien menciona más abajo. solo recrearé la ruta del archivo a partir del nombre del archivo. mira las respuestas de "Juha Syrjälä"
0 votos
@Mike, mi punto en realidad era que crearas un número de secuencia para la imagen (con secuencia de base de datos o columna de autoincremento, por ejemplo) y luego crearas el nombre de archivo y la ruta a partir de ese número de secuencia.
0 votos
Oh definitivamente abogo por esa idea (usada de manera similar en el pasado). si haces agrupaciones de letras por rama de directorio, simplemente ten en cuenta la distribución de densidad y las condiciones para cuántos caracteres 'colgantes' utilizar para el nombre de archivo real, y cómo manejar nombres de longitud impar versus par.
0 votos
Echa un vistazo a esta pregunta: stackoverflow.com/questions/1257415/… Puedes obtener algunas ideas adicionales allí...
0 votos
@Juha - los nombres de archivo ya están en secuencia y son únicos
0 votos
Los sistemas de archivos generalmente no son un buen mecanismo de almacenamiento para millones de archivos pequeños, ya que tienden a ocupar bloques completos de espacio (no solo su tamaño real). Si el espacio se convierte en un problema Y si el acceso será infrecuente y en lotes, es posible que desee considerar agrupar unos cientos o miles a la vez en archivos individuales (.tar o . zip)
0 votos
@user28770 FAT será una mala elección aquí. Debido a que la tabla de asignación de archivos es lineal, tendrás que buscar todas las entradas posibles para obtener un archivo. Además, no tienes un mapa de asignación que dará como resultado una fragmentación significativa.