La mejor manera de almacenar/recuperar los millones de archivos cuando su meta-datos en una Base de datos SQL

StackOverflow https://stackoverflow.com/questions/1257415

Pregunta

Tengo un proceso que va a inicialmente generar 3-4 millones de archivos PDF, y continuar en la tasa de 80K/día.Van a ser muy pequeñas (50K) cada uno, pero lo que me preocupa es cómo manejar la masa total de los archivos que estoy generando para una fácil búsqueda.Algunos detalles:

  1. Voy a tener algunos otros pasos para ejecutar una vez que un archivo se han generado, y habrá un par de servidores que participan, así que voy a tener los archivos a medida que los generó.
  2. Una vez generados, los archivos estarán disponibles a través de un proceso de búsqueda de los que he escrito.Esencialmente, voy a tener que tirar de ellos basado en un número de pedido, que es único para cada archivo.
  3. En cualquier momento, un orden existente número puede volver a presentarse, y el archivo generado tendrá que sobrescribir la copia original.

En un principio, había pensado escribir todos estos archivos en un único directorio en un NAS, pero me doy cuenta de que esto podría no ser una buena idea, ya que hay millones de ellos y Windows no puede soportar un millón-de-archivo-de búsqueda muy agraciado.Estoy buscando algunos consejos:

  1. Es una sola carpeta ¿de acuerdo?Los archivos nunca serán mencionados - que sólo se pueden recuperar utilizando un Sistema.IO.Archivo con un nombre de archivo ya he decidido.
  2. Si tengo que hacer una carpeta, puedo ver de nuevo los archivos con un Sistema de.IO.DirectoryWatcher, incluso con muchos archivos, o va a empezar a ser lento con que muchos de los archivos?
  3. Deben ser almacenados como Blob en una base de datos SQL Server en su lugar?Ya que voy a necesitar para recuperar un valor de referencia, tal vez esto tiene más sentido.

Gracias por tus pensamientos!

¿Fue útil?

Solución

Me había agrupar los archivos de las subcarpetas específicas, y tratar de organizarlos (las subcarpetas) de alguna manera de lógica de negocio. Tal vez todos los archivos realizan durante un día determinado? Durante un período de seis horas de cada día? O cada # de archivos, yo diría que unos pocos 1,000 máx. (Probablemente hay un número ideal por ahí, espero que alguien lo publicará.)

¿Los archivos nunca envejecen y se eliminan? Si es así, clasificar y archivo trozo ser eliminable. Si no es así, puedo ser su proveedor de hardware?

Hay argumentos en ambos lados de almacenamiento de archivos en una base de datos.

  • Por un lado te una mayor seguridad, porque es más difícil de extraer los archivos de la base de datos; por el contrario, se obtiene un rendimiento potencialmente más pobre, porque es más difícil de extraer los archivos de la base de datos.
  • En la base de datos, usted no tiene que preocuparse acerca de cómo muchos archivos por carpeta, sector, clúster NAS, lo que sea - que es el problema de la base de datos, y, probablemente, que tienen una buena aplicación para esto. Por otro lado, va a ser más difícil de manejar / revisar los datos, ya que sería un bazillion gotas en una sola tabla, y, bueno, qué asco. (Se puede particionar la tabla basada en el antes mencionado de lógica de negocio, lo que haría que su eliminación o archivar infinitamente más fácil de realizar. Eso, o tal vez las vistas con particiones, ya que la partición de tablas tiene un límite de 1.000 particiones.)
  • SQL Server 2008 tiene el tipo de datos FileStream; No sé mucho sobre él, podría ser vale la pena analizar.

Un último punto que preocuparse de mantener los datos "alineado". Si la base de datos almacena la información en el archivo junto con la ruta / nombre al archivo, y el archivo se mueve, usted podría conseguir totalmente manguera.

Otros consejos

Para responder a sus preguntas:

  1. No me almacenarlos en una sola carpeta. Como lo más probable es que en algún momento tendrá que buscar en los archivos reales en el disco, en lugar de alguna otra manera.
    En vez por qué no guardarlos en directorios separados, divididos en lotes de 1000? Posiblemente utilizando el ID como clave.
  2. Que muchos archivos probablemente inundar el DirectorWatcher, por lo que algunos se perderán. He utilizado este en el pasado, y más allá de un cierto punto (afew cien), he encontrado que empieza a perder archivos. Posiblemente utilizar un directorio diferente para los archivos entrantes, y luego procesar este de vez en cuando. Esto puede desencadenar un proceso para actualizar el original.
  3. No sería almacenar los documentos en una base de datos, pero sin duda repositorio de metadatos en una base de datos.

Puede organizar fácilmente archivos en varias carpetas sin tener que hacer esto mediante la lógica de negocio, o una orden por día, lo cual es especialmente bueno si ese tipo de pedido sería 'clumpy' (muchos hits en una carpeta, pocos en otros).

La forma más sencilla de hacer esto es crear un hash único para el nombre del archivo, por lo que tal vez se obtiene algo como esto:

sf394fgr90rtfofrpo98tx.pdf

A continuación, romper este en bloques de dos caracteres, y obtendrá la siguiente:

sf/39/4f/gr/90/rt/fo/fr/po/98/tx.pdf

Como se puede ver, le da un árbol de directorios de profundidad que se puede navegar con facilidad.

Con una buena función hash, esto será muy uniformemente distribuida, y nunca se conseguirá más de 1296 entradas por directorio. Si alguna vez tienes una colisión (que debe ser extremadamente raro), sólo tiene que añadir un número al final: tx.pdf, tx_1.pdf, tx_2.pdf. Una vez más, las colisiones en tan grandes valores hash debe ser extremadamente raros, por lo que el tipo de aglutinación se obtiene debido a esto es un no-tema.

Usted ha dicho que los documentos están firmados digitalmente, por lo que es probable que tenga el hash que necesita justo allí en forma de la cadena de firma.

1) Una carpeta simple puede ser aceptablemente rápido con un índice separado, pero como es trivial para ponerlo en subdirectorios que permitirían a sí mismo la capacidad de navegar acaba de hacer eso.
Así que ahora usted tiene que averiguar su convención de nombres. A pesar de que normalmente te sugeriría un hash para obtener una distribución uniforme de las identificaciones pero como se está haciendo tanto probablemente tiene sentido utilizar los valores que ya tienes. Si usted tiene un número de orden es lo que tiene una marca de tiempo también? Si es así, simplemente prefijar el número de pedido con una marca de tiempo.

Ten en cuenta que si usted está utilizando ID de compra puede experimentar http: // en .wikipedia.org / wiki / Benford% 27s_law

Es necesario para probarlo. Todas estas soluciones dependen del sistema de archivos subyacente. Algunos sistemas de ficheros pueden manejar grandes directorios, otros no pueden. Algunos sistemas de archivos índice de sus directorios, otros no (estos dos puntos no están necesariamente relacionados).

Rompiendo las cosas en un árbol de directorios tiene posibilidades razonables de ser performante, simplemente porque, al final, los directorios individuales tienden a tener pocas entradas generales. Eso funciona para casi cualquier sistema de archivos, simplemente porque incluso un "tonto" que está haciendo una búsqueda en el directorio lineal para su archivo puede buscar un par de cientos de entradas razonablemente rápido.

Si el sistema de archivos está indexando los directorios (como, por ejemplo, un árbol b, o simplemente ordenando internamente que es efectivamente lo mismo en este contexto), entonces los tamaños de directorio son menos importantes, aunque algunas herramientas pueden quejarse (la carga de una Explorador de windows ventana con los archivos 4M, que no saben qué va a pasar).

Por lo tanto, me gustaría investigar su sistema operativo planificado y las opciones del sistema de archivos, y probarlo y ver qué funciona mejor para usted.

Determinar algún orden lógico de subdirectorios y almacenarlos en bloques de no más de 512 archivos más o menos en una carpeta.

No guarde los archivos en una base de datos. Las bases de datos son los datos, servidores de archivos son los archivos. Almacenarlos en un servidor de archivos, pero almacenar la ruta y recuperación de información en una base de datos.

¿Por qué no considerar Almacenamiento de todos esos archivos después convertida en PDF en la base de datos (blob) De ahí Ventajas:

  1. Me creer que no tendrá que lidiar con el sistema operativo direclty de E / S, y dejar todo en manos del PP.
  2. No hay necesidad de nombrar un hash
  3. Fácil de copia de seguridad y mantener

Cuando se utiliza una base de datos para almacenar sus archivos, especialmente con pequeño archivo de la cabeza debe ser pequeña. pero también se puede hacer cosas como:

DELETE FROM BLOBTABLE WHERE NAME LIKE '<whatever>'

o cuando se tiene una fecha de caducidad, o desea actualizar un archivo, y eliminar por:

DELETE FROM BLOBTABLE WHERE CREATIONDATE < ...
etc...

Pregunta:

¿Por qué estos documentos deben ser generados y almacenados como archivos PDF?

Si ellos se pueden generar, por qué no sólo mantener los datos en la base de datos y generar sobre la marcha cuando sea necesario? Esto significa que puede buscar los datos reales que se requiere para la búsqueda de todos modos y no tener los archivos en el disco. De esta manera también se puede actualizar la plantilla PDF cuando sea necesario sin la necesidad de regenerar algo?

1) Esto va totalmente en contra de lo que normalmente predico, pero es posible que desee para almacenarlos en una base de datos SQL ya que son pequeños archivos apunté. SQL Server también permitiría a encontrar rápida y fácilmente los archivos que necesita sin destrozar el disco loco que normalmente se asocian con la enumeración de un directorio tan grande. Además, el almacenamiento de los archivos en SQL (mientras que en general estoy en contra) aliviaría en gran medida la copia de seguridad / proceso de restauración.

2) a todos Almacenar en directorios y, o bien el índice de servicio de las ventanas de indexación ( escalofríos ) o crear su propio índice en SQL Server que contendrá el nombre del archivo y ruta completa. Yo sugeriría almacenándolos en directorios separados, con sólo unas pocas decenas de miles de archivos de cada uno. Tal vez usted podría utilizar el fin de año como el nombre de la carpeta?

Independientemente de cómo su almacenado - , no escanear el directorio para encontrar los archivos -. Que sin duda necesita tener un índice de algún tipo

Espero que esto ayude!

Mi archivo de base de datos contiene más de 4 millones de carpetas con muchos archivos en cada carpeta.

Sólo tiró todas las carpetas de un directorio.NTFS puede manejar esto sin ningún problema, y herramientas avanzadas como robocopy puede ayudar cuando se necesita para moverlo.

Sólo asegúrese de que usted puede indexar los archivos sin un análisis.Hice esto por tirar mi índice en una base de datos mysql.

Así que para obtener un archivo de búsqueda de la base de datos mysql en algunos metadatos y obtener un índice.Entonces yo uso este índice para leer el archivo directamente.Escala bien para mí hasta ahora.Pero tenga en cuenta que usted va a estar dando vueltas todo en acceso aleatorio y, por tanto, al azar de lectura/escritura.Este es pobre rendimiento para el HDD, pero, afortunadamente, SSD va a ayudar mucho.

Además, yo no tirar los archivos en la base de datos mysql.Usted no será capaz de hacer lecturas de red sin tener un cliente que entender mysql.Ahora puedo acceder a cualquier archivo a través de la red utilizando cualquier programa porque me la puede usar su URL de red.

Creo que al igual que muchos otros han dicho, que debe hacer subcarpetas, pero de una manera que se pueden encontrar los datos a través de código. Por ejemplo, si trabaja de fecha y hora, el uso que. De la lectura de lo que ha dicho, parecería que existe alguna forma de estructura jerárquica de los informes (diarios,, informe diario semanal X, informe Y por hora, etc) Me gustaría ver la estructura de cuándo y por qué se generan los informes y construir mis directorios de esa manera.

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