2009-11-17 4 views
2

Ma situation implique un répertoire contenant des fichiers MP3, et une base de données qui devrait contenir toutes les métadonnées MP3 (genres, noms d'artistes, noms d'album, et noms de pistes) des fichiers MP3 dans ce répertoire. La base de données doit toujours refléter ce qui se trouve dans le répertoire, c'est-à-dire que ... l'algorithme que je cherche ne devrait jamais supprimer des éléments du répertoire, seulement de la base de données. Le répertoire est l'original, la base de données doit être la copie exacte du répertoire après l'exécution du programme, et le répertoire doit rester intact par le programme. D'après ce que je comprends, je crois que je devrais faire une boucle sur le contenu du répertoire en insérant des enregistrements dans la base de données quand je rencontre des métadonnées MP3 qui se trouvent dans le répertoire mais qui ne se trouvent pas dans la base de données. Ensuite, faites une boucle sur le contenu de la base de données et supprimez de la base de données ce qui ne se trouve pas dans le répertoire.Qu'est-ce qu'un moyen pratique de synchroniser des données dans un répertoire vers une base de données?

Existe-t-il un algorithme général pour synchroniser deux choses telles qu'un répertoire et une base de données? Y a-t-il une meilleure façon de faire cela que ce que j'ai décrit? J'essaye de compléter cette tâche en utilisant Ruby Sequel et MySQL, au cas où cela serait important.

Juste pour clarifier, supposons que toutes les données d'étiquette MP3 sont correctes. Je cours tous les fichiers par l'intermédiaire d'un étiqueteur MP3 automatique et m'assure que tout est étiqueté avec précision avant de le déplacer dans ce répertoire.

Ma solution préférée serait d'exécuter un script Ruby manuellement, plutôt qu'avec Cron par exemple. Mes raisons sont parce que c'est la langue que j'utilise déjà pour mettre en œuvre la plupart de ce projet, et je dois marquer manuellement tous les fichiers MP3 et vérifier qu'ils sont corrects, donc je ne veux pas que des scripts soient exécutés jusqu'à ce que je puisse vérifier les fichiers dans mon répertoire MP3 sont bons à faire.

Répondre

0

En termes de stratégies générales,

stratégie webguydan a un fichier en boucle scénario et les enregistrements de base de données et en les comparant, en arrière et en avant. Vous pouvez faire mieux en tirant parti de votre base de données plus.

Notez ce qui sera et ne sera pas lent ici: Les insertions de base de données sont l'opération de base de données la plus rapide. Votre opération la plus lente sera probablement lire les métadonnées MP3 du système de fichiers. Les appels uniques au système de fichiers ou à la base de données sont beaucoup plus coûteux que les opérations de définition (obtenir une liste de fichiers). En particulier, l'opération de suppression qui vérifie l'existence d'un fichier sur des centaines de lignes sera assez lente.

Stratégie 2. Création d'une table de transfert dans la base de données pour effectuer des comparaisons.Votre script lit tous les mp3 et les insère dans une table de mise en scène, qui est une copie vide de la table mp3. Vous vous joignez ensuite à la table réelle pour identifier les mouvements, les suppressions, les ajouts.

Stratégie 3: Il suffit de remplacer la totalité de la table de base de données. Je soupçonne que la partie lente de cette opération sera la lecture des métadonnées mp3, pas n'importe quelle opération de base de données. Puisque votre processus lit toutes les métadonnées mp3 de toute façon pour identifier les changements, il suffit de remplacer la base de données sql entière à chaque actualisation.

Je commencerais par cette approche et j'optimiserais si nécessaire. Le remplacement ne fonctionnera pas si vous avez des informations supplémentaires que vous avez stockées dans la base de données mp3 sql que vous n'avez pas pu remplacer du système de fichiers. Stratégie 4: Selon la version de votre système d'exploitation, l'extraction des métadonnées mp3 peut être lente (ou pas?) Ignorer la lecture des parties lentes du système de fichiers (métadonnées?) En lisant path, name, update date dans votre table de transfert. Les requêtes sql simples peuvent identifier les fichiers qui doivent être mis à jour (lire des données mp3), supprimés de la table ou insérés. Autres approches: Notez que de nombreux systèmes d'exploitation et produits autorisent déjà les requêtes de style de base de données vers les données dont vous parlez. Service d'indexation MS, par exemple.

0

Vous pouvez probablement gérer cela avec 2 scripts cron planifiés.

Le premier script peut analyser le répertoire et rechercher des fichiers dont la date de modification est supérieure à la dernière fois que l'analyse a été effectuée (ou sur la base de l'enregistrement le plus récent dans la base de données). Lorsqu'un nouveau fichier est trouvé, le script peut effectuer une insertion.

Vous pouvez lire les tags ID3 du MP3 pour obtenir la plupart des métadonnées que vous recherchez, bien que cela suppose que tous vos fichiers contiennent ces données. Vous devez envisager des mécanismes de secours pour ce qui se passe lorsque des données sont manquantes, par exemple en utilisant le nom de fichier.

Le script de suppression peut fonctionner à l'envers. Vous devrez conserver un champ dans la base de données qui contient le chemin relatif au fichier dans le répertoire. Vous pouvez ensuite parcourir les enregistrements de la base de données et vérifier que chaque fichier existe. Quand on n'est pas trouvé, vous pouvez ajouter l'ID à une liste. Après l'analyse, vous pouvez exécuter l'instruction delete sur les ID capturés.