2011-03-02 20 views
9

¿Alguien sabe alguna biblioteca java (código abierto) que proporciona funciones para manejar una gran cantidad de archivos (escritura/lectura) desde un disco. Estoy hablando de 2-4 millones de archivos (la mayoría de ellos son documentos pdf y ms). no es una buena idea almacenar todos los archivos en un solo directorio. En lugar de reinventar la rueda, espero que ya la haya hecho mucha gente.API de contenido Java para una gran cantidad de archivos

Características Estoy buscando 1) Capaz de escribir/leer archivos desde el disco 2) capaz de crear directorios azar/subdirectorios para los nuevos archivos 2) Proporcionar la versión/auditoría (opcional)

I estaba mirando API JCR y parece prometedor, pero comienza con un espacio de trabajo y no está seguro de cuál será el rendimiento cuando hay muchos nodos.

Respuesta

0

Combine la funcionalidad en el paquete java.io con su propia solución personalizada.

El paquete java.io puede escribir y leer archivos del disco y crear directorios arbitrarios o subdirectorios para archivos nuevos. No se requiere una API externa.

El control de versiones o auditoría debería proporcionarse con su propia solución personalizada. Hay muchas maneras de manejar esto, y es probable que tenga una necesidad específica que debe completarse. Especialmente si le preocupa el rendimiento de una API de código abierto, es probable que obtenga el mejor resultado simplemente codificando una solución que se ajuste específicamente a sus necesidades.

Parece que su módulo debe analizar todos los archivos al inicio y formar un índice de todo lo que está disponible. Según el método utilizado para compartir e indexar estos archivos, puede volver a explorar los archivos de vez en cuando o puede codificarlo para recibir un mensaje de algún servidor central cuando hay un nuevo archivo o versión disponible. Cuando alguien solicita un archivo o proporciona un nuevo archivo, su módulo sabrá exactamente cómo está organizado y exactamente dónde conseguirlo o colocarlo dentro del árbol de directorios.

Parece que sería mucho más fácil diseñar una solución específica para sus necesidades.

1

Editar: JCP se ve bastante bien. Sugeriría probarlo para ver cómo funciona realmente para tu caso de uso.

Si está ejecutando su sistema en Windows y notó un horrible rendimiento n^2 en algún momento, es probable que se encuentre con el rendimiento alcanzado por la generación automática de nombre de archivo 8.3. Por supuesto, puede disable 8.3 filename generation, pero como señaló, no sería una buena idea almacenar grandes cantidades de archivos en un solo directorio.

Una estrategia común que he visto para manejar grandes cantidades de archivos es crear directorios para las primeras n letras del nombre del archivo. Por ejemplo, document.pdf se almacenaría en d/o/c/u/m/document.pdf. No recuerdo haber visto una biblioteca para hacer esto en Java, pero parece bastante sencillo. Si es necesario, puede crear una base de datos para almacenar la tabla de búsqueda (asignando claves a los nombres de archivo aleatorios distribuidos uniformemente), por lo que no tendrá que volver a generar su índice cada vez que inicie. Si desea obtener el beneficio de la deduplicación automática, puede actualizar el contenido de cada archivo y usar esa suma de verificación como el nombre de archivo (pero también podría agregar un cheque para no descartar accidentalmente un archivo cuya suma de verificación coincida con un archivo existente incluso aunque los contenidos son realmente diferentes).

Dependiendo del tamaño de los archivos, también podría considerar almacenar los archivos en una base de datos; si hace esto, sería trivial agregar versiones, y no necesariamente tendría que crear nombres de archivo aleatorios porque podría hacer referencia a ellos utilizando una clave primaria generada automáticamente.

Cuestiones relacionadas