10
votes

Un moyen de faire md5_file () plus rapidement?

J'utilise actuellement md5_file () pour parcourir environ 15 URL et vérifier leurs hachages MD5. Y a-t-il un moyen de faire cela plus vite? Il faut beaucoup trop de temps pour courir à travers tous.


5 commentaires

"Courez environ 15 URL" signifie quelque chose comme md5_file ('http: //some.url/foo') dans une boucle avec 15 URL différentes? Quelle est la taille de ces "fichiers"?


Oui, c'est exactement ça. Je les tire dans une base de données MySQL puis les exécuter dans md5_file ($ Résultat) dans une boucle. Les fichiers sont très petits et n'ont en effet aucune sortie d'affichage, pas d'interface utilisateur, juste une page blanche vierge lors de la visualisation


La question est que vous calculez les hachages en séquence plutôt qu'en parallèle; md5_file n'est pas le goulot d'étranglement. De plus, le hachage d'un fichier vide va-t-être toujours être le même.


Le hash changera si le fichier change.


md5_file () en soi est lent. Il faut 0,4 sec pour renvoyer le MD5 pour un fichier de 70 Ko.


8 Réponses :


0
votes

L'algorithme MD5 est à peu près aussi rapide que possible et récupérer des URL est à peu près aussi rapide que possible (ralentir si les fichiers sont énormes ou que vous avez une connexion lente). Donc non. Vous ne pouvez pas le rendre plus rapide.


0 commentaires

0
votes

Bien évidemment, vous ne pouvez rien faire avec md5_file () pour faire plus vite, vous pouvez utiliser quelques Micro-optimisations ou code de ré-factorisation pour obtenir un gain de vitesse mais encore une fois, vous ne pouvez pas accélérer la fonction intégrée < Code> md5_file () .


2 commentaires

... Bien sûr, quelques micro-optimisations pourraient se raser 2 millisecondes de son runtime. Peut-être. Ou il pouvait simplement tirer les URL en parallèle et économiser quelques secondes. "Micro-optimisations" ne vaut presque jamais l'effort.


@Frank, ceci a été affiché avant la modification de la question pour inclure le code en question (qui, jusqu'à ce que, jusqu'à ce que le code ait été ajouté, on demande essentiellement comment accélérer MD5_File ()).



0
votes

non. Comme il s'agit d'une fonction intégrée, il n'y a aucun moyen de le rendre plus rapide.

Mais si votre code télécharge des fichiers avant de les md5ing, il peut être possible d'optimiser vos téléchargements pour être plus rapides. Vous pouvez également voir une augmentation de vitesse en définissant la taille du fichier (à l'aide de Ftruncate) avant de l'écrire si vous connaissez la taille à l'avance.

En outre, si les fichiers sont suffisamment petits pour rester en mémoire et que vous les avez déjà en mémoire (car ils ont été téléchargés ou sont en cours de lecture pour une autre fin), vous pouvez utiliser MD5 Pour fonctionner sur elle en mémoire plutôt que md5_file qui nécessite qu'elle soit à nouveau lue sur le disque.


0 commentaires

15
votes

Probablement vous le faites séquentiellement en ce moment. C'est à dire. Fetch Data 1, Données de processus1, Fetch Data 2, Données de processus 2, ... et le goulot d'étranglement peut être le transfert de données.
Vous pouvez utiliser curl_multi_exec () pour parallementer un peu . Soit enregistrer un curlopt_writfunction et traiter chaque morceau de données (délicat puisque MD5 () fonctionne exactement un morceau de données).
Ou vérifier les poignées de courbure déjà terminées, puis traiter les données de cette poignée.

EDIT: Edition rapide et sale à l'aide de Extension de hachage (qui fournit des fonctions pour les hachages incrémentielles) et un Fermeture PHP5.3 + : xxx

(n'ai pas vérifié les résultats cependant ... ce n'est qu'un point de départ)


2 commentaires

+1. La parallélisation des téléchargements est probablement une énorme victoire ici. Vous pouvez également parlementer la partie MD5 également, soit à l'aide de la commande md5sum cli (par exemple, EXEC ('Bash -C "Fichier MD5Sum1> File1.md5 &"') ), ou en utilisant quelque chose comme PHP's PCNTL_FORK () à plusieurs appels à plusieurs appels à MD5_SUM (). Celles-ci ont à la fois leurs inconvénients, mais dans le bon contexte, ils peuvent être la meilleure chose à faire.


Et je dois admettre que je n'ai même pas testé si le téléchargement continue vraiment pendant que le rappel est exécuté. Mais puisque les portions de données sont supposées petites, j'espère que cela n'a pas d'importance (beaucoup).



0
votes

Vous vérifiez probablement les mêmes URL sur une période de temps? Pourriez-vous vérifier les derniers en-têtes modifiés pour l'URL? Si la page en cours de vérification n'a pas changé, il n'y aurait pas besoin de ré-calculer le MD5.

Vous pouvez également demander aux pages de manière asynchrone afin de pouvoir être traitées en parallèle, plutôt que dans la série, ce qui devrait accélérer.


0 commentaires

0
votes

La vitesse de l'algorithme MD5 est linéaire. Plus l'entrée, plus il faudra de temps, plus si le fichier est grand, il n'y a pas grand chose que vous puissiez faire, vraiment.

Maintenant, comme Volkerk déjà suggéré, le problème n'est probablement pas le hasard MD5, mais la récupération et la lecture du fichier sur le net.


0 commentaires