Nos gustaría almacenar millones de archivos de texto en un sistema de archivos Linux, con el propósito de poder comprimir y servir una colección arbitraria como servicio. Hemos probado otras soluciones, como una base de datos clave / valor, pero nuestros requisitos de concurrencia y paralelismo hacen que el uso del sistema de archivos nativo sea la mejor opción.
La forma más directa es almacenar todos los archivos en una carpeta:
$ ls text_files/
1.txt
2.txt
3.txt
que debería ser posible en un sistema de archivos EXT4 , que no tiene límite para la cantidad de archivos en una carpeta.
Los dos procesos de FS serán:
- Escribir un archivo de texto desde el web scrape (no debería verse afectado por la cantidad de archivos en la carpeta).
- Comprima los archivos seleccionados, dados por la lista de nombres de archivos.
Mi pregunta es: ¿el almacenamiento de hasta diez millones de archivos en una carpeta afectará el rendimiento de las operaciones anteriores, o el rendimiento general del sistema, de manera diferente a hacer un árbol de subcarpetas para que vivan los archivos?
ls -l
o cualquier otra cosa que sea stat
cada inodo en el directorio (por ejemplo, bash
finalización de pestañas / tabulación) será artificialmente más rápido que después de un poco de desgaste (borre algunos archivos, escriba algunos nuevos). ext4 podría funcionar mejor con esto que XFS, porque XFS asigna dinámicamente espacio para inodes frente a datos, por lo que puede terminar con inodos más dispersos, creo. (Pero esa es una suposición pura basada en muy poco conocimiento detallado; apenas he usado ext4). Ir con abc/def/
subdirs.
ZipOutputStream
superaría a casi cualquier sistema de archivos nativo de Linux gratuito. Dudo que quiera pagar por el GPFS de IBM. El ciclo para procesar un conjunto de resultados JDBC y hacer que la secuencia zip sea probablemente solo de 6 a 8 líneas de código Java.
dir_index
, que a menudo está habilitado de forma predeterminada, acelerará las búsquedas, pero puede limitar la cantidad de archivos por directorio.