2009-03-22 9 views
12

Il y a quelques très bonnes questions sur SO concernant la gestion de fichiers et le stockage dans un grand projet.Conseils pour gérer un grand nombre de fichiers?

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

Le premier ayant quelques grandes intuitions et mon projet, je l'ai décidé d'aller la route fichier et non la route DB.

Un point majeur contre l'utilisation du système de fichiers est la sauvegarde. Mais dans notre système, nous avons un excellent système de sauvegarde, donc je ne suis pas inquiet à ce sujet.

Le chemin suivant est comment stocker les fichiers réels. Et j'ai pensé à avoir l'emplacement des fichiers statiques à tout moment et créer un système de répertoire virtuel dans le côté de la base de données. Donc, les liens vers le fichier ne changent pas.

Le système que je construis aura une gestion de fichiers globale de sorte que tous les fichiers sont accessibles à tous les utilisateurs. Donc, ma question est, quels sont quelques conseils ou des méthodes de meilleures pratiques dans la création de dossiers pour ces fichiers statiques, par exemple:

ou si je ne devrais pas aller la route du répertoire virtuel du tout.

(le projet est sur la pile LAMP (PHP) si cela aide à tous)

+1

peut-être jeter un oeil à: http://stackoverflow.com/questions/191845/how-to-store-images-in-your-filesystem – Jacco

+0

BTW Je ne suis pas seulement stocker des images, je stocke tout type. –

+0

mais les mêmes principes/problèmes s'appliquent – Jacco

Répondre

11

Une façon est d'attribuer un numéro unique à chaque fichier et l'utiliser pour rechercher l'emplacement du fichier réel. Ensuite, vous utilisez ce numéro pour distribuer des fichiers dans différents répertoires du système de fichiers. Par exemple, vous pouvez utiliser quelque chose comme ce schéma:

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

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

+0

En fait, j'avais quelque chose de similaire à l'esprit, mais je n'arrêtais pas de penser à quand les chiffres augmentent pour continuer à ajouter des répertoires sous eux? Aussi pensé à créer des directeurs à partir de la date à laquelle le fichier est créé (ou mois), mais que se passe-t-il si un mois est très lourd sur les fichiers. –

+0

Cette méthode distribuerait probablement les fichiers de manière plus uniforme. La date et l'heure ont l'inconvénient de devoir stocker et consulter la date. Vous pouvez rendre cette méthode évolutive en montant certains répertoires sous un serveur différent. –

6

Afin d'éviter la création d'un nombre excessif d'entrées dans un seul répertoire, vous peut vouloir baser la création de répertoires sur des morceaux du nom de fichier. Par exemple, si vous avez un fichier nommé d7f5ae9b7c5a.png, vous pouvez le stocker dans media/d7/f5/d7f5ae9b7c5a.png. Si vos noms de fichiers sont tous hexadécimaux, cela limitera le nombre d'entrées dans un seul répertoire à 256 jusqu'au niveau final.

+0

Ill qui fonctionne bien pour les fichiers avec des caractères accentués ou des espaces? Mais je vais probablement dépouiller/traduire ces personnages, bonne suggestion. –

+0

Si vous utilisez un hash pour votre nom de fichier, le seul endroit où les caractères non-ASCII apparaîtront est dans la base de données, et il est probablement plus facile de les gérer dans la base de données que sur le système de fichiers. –

1

je prends habituellement cette approche:

Avoir une variable de paramètres globaux pour votre application qui pointe vers le dossier où vous stockez les fichiers téléchargés. Dans votre base de données stocker les chemins relatifs aux fichiers (par rapport à ce que la variable de paramètres pointe vers). Par conséquent, si un fichier se trouve dans /www/uploads/image.jpg, vos paramètres peuvent être affichés dans/www/uploads votre ligne de base de données a image.jpg. C'est une manière flexible de découpler la structure de votre répertoire système de votre application.

De plus, vous pouvez fragmenter le stockage de fichiers dans des répertoires en fonction des tables de base de données auxquelles ils se rapportent. Supposons que vous ayez une table user_reports et une table user_photos. Vous stockez les fichiers associés à user_reports dans/www/uploads/user_reports.Si vous avez un grand nombre de téléchargements d'utilisateurs, vous pouvez implémenter fragmentaion encore plus loin. Supposons qu'un utilisateur télécharge un fichier le 20.03.2009, le fichier s'appelle report.pdf, donc vous le stockez dans /www/uploads/user_reports/2009/03/20/report.pdf.

2
  1. Une image utilisateur ~ 100kb, alors laissez avoir 10 000 utilisateurs dans la base de données, chaque utilisateur aura en moyenne 5 images, donc nous aurons 5 téraoctets DB, et chaque sortie d'image sera exécutée par un DB et ce trafic DB supplémentaire réduira la performance générale du serveur de base de données. ... vous pouvez utiliser le cluster DB pour éviter cela, mais supposez qu'il est cher

  2. Rapport d'utilisateur sur l'erreur sur la base de données en direct, (sur le test - fonctionne correctement), comment créeriez-vous dump un décompresser sur les développeurs machine? Combien de temps ça va prendre?

  3. En un instant, vous pouvez décider de mettre des images sur certains CDN, quels seront les changements dans votre code source?

+0

Je n'utilise pas de base de données pour les données d'image réelles. –

9

J'ai rencontré ce problème il y a quelque temps pour un site Web qui hébergeait beaucoup de fichiers. Ce que nous avons fait était de prendre un GUID (qui est aussi le champ clé primaire d'un fichier) (par exemple BCC46E3F-2F7A-42b1-92CE-DBD6EC6D6301) et de stocker un fichier comme ceci:/B/C/C/BCC46E3F-2F7A-42b1 -92CE-DBD6EC6D6301/filename.ext

Cela présente certains avantages:

  • Vous pouvez faire évoluer les serveurs de fichiers sur plusieurs serveurs (et attribuer des répertoires spécifiques à chacun)
  • Vous n'avez pas pour renommer le fichier
  • Vos répertoires sont garantis être uniques

Espérons que cela aide!

1

Je ne peux pas dire grand-chose sur la façon dont Apache et PHP gèrent les fichiers, mais je peux dire quelque chose sur le système de fichiers ext3. ext3 ne semble pas avoir de problèmes avec un grand nombre de fichiers dans le même répertoire. Je l'ai testé avec jusqu'à un million de fichiers. Assurez-vous que l'option dir_index est activée sur le système de fichiers avant de créer les répertoires. Vous pouvez vérifier en exécutant dump2fs et modifier cette option en exécutant tune2fs. Hacher les fichiers dans une arborescence de sous-répertoires peut toujours être utile car les outils de ligne de commande peuvent toujours avoir des problèmes pour répertorier le contenu du répertoire.

Questions connexes