2010-09-15 6 views
0

J'ai une base de données où chaque entrée a un chemin de fichier et un dernier champ modifié:La façon la plus efficace de mettre à jour une liste de fichiers plats

1284581625555 C:\docs\text1.txt 
1284581646992 C:\docs\text2.txt 
1284581654886 C:\docs\text3.txt 
1284581662927 C:\docs\subfolder\text4.txt 
1284581671986 C:\docs\subfolder\text5.txt 
... 

Chaque entrée dispose également d'un résumé du contenu des fichiers et les entrées ont été créés en parcourant récursivement un certain dossier (dans ce cas C: \ docs) et en ajoutant tous les fichiers visités. Maintenant, je voudrais mettre à jour la base de données, à savoir

  • Ajouter fichiers nouvellement créés
  • Supprimer les fichiers supprimés
  • mise à jour des fichiers modifiés

De toute évidence, je dois marcher à nouveau le dossier racine pour voir ce qui a changé. Mais quel est le moyen le plus efficace de le faire?

Il y a deux approches que je peux penser:

  • première traversée de la base de données, supprimer toutes les entrées supprimées et mettre à jour toutes les entrées modifiées. Pour cela, chaque fois que vous devez créer un objet fichier à partir de la chaîne de chemin d'accès stockée, appelez file.exists() ou file.isModified(). Ensuite, parcourez récursivement le dossier racine et ajoutez les fichiers qui ne sont pas encore dans la base de données.
  • Commencez par parcourir l'arborescence de fichiers et rappelez-vous dans une liste ce qui a été ajouté/supprimé/modifié --- ceci nécessite d'avoir stocké un instantané complet de l'état précédent de l'arborescence de fichiers. Parcourez ensuite la base de données et ajoutez/supprimez/modifiez les entrées, en fonction de la liste créée précédemment.

Quelle approche est la meilleure? Y en a-t-il d'autres?

EDIT: La création du récapitulatif est très coûteuse (extraction de texte intégral) et la traversée de la base de données est également coûteuse, car elle est basée sur des fichiers.

Répondre

2

Je pense que la façon la plus simple de le faire serait de supprimer et de recréer le fichier. En fonction de la difficulté de créer le "résumé", cela pourrait bien être la méthode la plus rapide puisque vous n'avez pas besoin de comparer ou d'éditer quoi que ce soit. Si la création du résumé est "difficile" et que la base de données est en mémoire, le plus simple serait de charger la base de données dans un dict (avec le nom du fichier, avec des données indiquant si le fichier a été ou non "vu") et refait l'os.walk, mettant à jour le dict si nécessaire. Puis itérer le dict, en écrivant toutes les entrées qui ont été vues.

(BTW le dernier champ modifié n'est pas forcément utile, vous devez vérifier la date de modification du fichier de toute façon ainsi pourrait tout aussi bien le comparer à l'horodatage de la base de données.)

1

Probablement la meilleure façon de gérer cela est de re-promener l'arbre dans son intégralité. De cette façon, au lieu d'appeler File.exist() tout le temps, vous n'appelez Directory.list() qu'une seule fois par répertoire. Cela vous évite les appels d'E/S sur fichiers, ce qui est probablement le goulot d'étranglement dans cette situation.

Une fois que vous avez une liste des fichiers actuellement existants, vous pouvez comparer les deux listes, et déterminer pour chaque fichier:

  • Nouveau fichier
  • fichier supprimé
  • fichier modifié

et procéder en conséquence.

Questions connexes