Conseils pour gérer un grand nombre de dossiers?

il y a ici de très bonnes questions sur la gestion de fichiers et le stockage dans un grand projet.

stocker des Images dans DB-Yea ou Nay?

stockeriez-vous des données binaires dans une base de données ou dans un système de fichiers?

le premier ayant de grandes idées et dans mon projet j'ai décidé de suivre la route des fichiers et non LA ROUTE DES DB.

Un point majeur contre l'utilisation du système de fichiers de 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 la base de données des choses. Donc les liens vers le fichier ne changent pas.

le système que je suis en train de construire aura une gestion globale des fichiers afin que tous les fichiers soient accessibles à tous les utilisateurs. Mais beaucoup de ceux qui ont suivi la voie du fichier parlent Taille du répertoire physique (si tous les fichiers se trouvent dans un répertoire par exemple)

alors ma question Est, quels sont quelques conseils ou des méthodes de meilleure pratique dans la création de dossiers pour ces fichiers statiques, ou si Je ne devrais pas aller la route du répertoire virtuel du tout.

(le projet est sur la pile LAMP (PHP) si ça peut aider)

12
demandé sur Community 2009-03-22 19:38:05

6 réponses

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

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

{0}: file_number % 100

{1}: (file_number / 100) % 100

{2}: file_number

11
répondu Mehrdad Afshari 2009-03-22 16:49:11

j'ai rencontré ce problème il y a quelque temps pour un site 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

c'est Ce qui a des avantages certains:

  • Vous pouvez mettre à l'échelle les serveurs de fichiers sur plusieurs serveurs (et attribuer des répertoires spécifiques à chacun)
  • vous ne pas avoir à renommer le fichier
  • vos répertoires sont garantis uniques

Espérons que cette aide!

9
répondu Jeroen Landheer 2009-03-22 17:47:48

afin d'éviter de créer un nombre excessif d'entrées dans un seul répertoire, vous pouvez vouloir baser la création de répertoires sur des morceaux du nom de fichier. Ainsi, par exemple, si vous avez un fichier nommé d7f5ae9b7c5a.png, vous pouvez stocker dans les médias/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.

6
répondu Ignacio Vazquez-Abrams 2009-03-22 16:50:42
  1. une image d'utilisateur ~ 100kb, donc laissez 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 via une DB et ce trafic supplémentaire de DB réduira la performance générale du serveur de DB. ... vous pouvez utiliser le cluster DB pour éviter cela, mais supposons que cela coûte cher

  2. rapport D'utilisateur sur l'erreur sur la base de données en direct, (sur le test - tout fonctionne correctement), comment créeriez-vous dump un unpack c'est sur developers machine? Combien de temps cela va prendre?

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

2
répondu se_pavel 2009-03-22 17:02:16

j'ai l'habitude de prendre cette approche:

paramètres globaux variable pour votre application qui pointe vers le dossier où vous stockez les fichiers téléchargés. Dans votre base de données, stockez les chemins relatifs vers les fichiers (par rapport à ce que la variable paramètres pointe).

donc si un fichier est situé dans /www/uploads/image.jpg, vos paramètres varible points to/www / uploads votre ligne de base de données a l'image.jpg. C'est une façon flexible de découpler la structure du répertoire de vos systèmes votre application.

en outre, vous pouvez fragmenter le stockage de fichier dans les répertoires basés sur ce que les tables de base de données CES se rapportent. Disons que vous avez un rapport d'utilisateur de table et un Photos d'utilisateur de table. Vous stockez les fichiers relatifs à user_reports dans /www/uploads/user_reports. Si vous avez un grand nombre d'utilisateurs téléchargés, vous pouvez mettre en œuvre fragmentaion encore plus loin. Dire qu'un utilisateur télécharge un fichier sur 20.03.2009, le fichier est appelé rapport.pdf, donc vous le stockez à /www / uploads/user_reports/2009/03/20/rapport.PDF.

1
répondu Vasil 2009-03-22 16:58:00

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 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. Hasher les fichiers dans un arbre de sous-répertoires peut encore être utile parce que les outils en ligne de commande peuvent encore avoir des problèmes pour lister le contenu du répertoire.

1
répondu Sean McCauliff 2011-07-15 20:07:04