2010-11-02 4 views
0

J'ai ~ 200K propriétés nommées et ~ 25K fichiers. J'extrais si les propriétés tiennent ou non pour chaque fichier utilisant Python comme un ensemble de propriétés qui tiennent, un ensemble pour chaque fichier.Hash + mappage ou index + mappage pour condenser l'utilisation des chaînes

Pour effectuer cette extraction, je pourrais exécuter des centaines de scripts d'extraction python individuels sur une batterie de calcul, en parallèle. Chacun laissant derrière lui une représentation de l'extraction de l'ensemble de chacun des fichiers.

Un traitement supplémentaire implique la lecture de ces ensembles 20K et le traitement des données accumulées. pour générer un rapport sur cet ensemble de fichiers/propriétés. Un problème que j'ai, c'est que si je stocke l'ensemble extrait en tant que texte alors les longues chaînes de nom de propriété et de nom de fichier seront répétées gaspiller de l'espace disque et augmenter le temps d'analyse. Je pensais à créer un index central des noms de propriétés triés et à enregistrer simplement l'index - même pour les noms de fichiers, probablement des fichiers .py à importer.

Une alternative à l'utilisation d'un index dans la liste de noms triée serait d'utiliser str. hash() en tant qu'index ce qui signifierait probablement un traitement plus rapide, mais je suis inquiet de la possibilité de deux chaînes inégales se terminant par la même hachage() valeur. Cela pourrait-il arriver?

J'utiliserais le même exécutable Python et la même version de système d'exploitation sur toutes les machines.

Répondre

2

Connaissez-vous les propriétés à l'avance? Si vous le faites, vous pouvez considérer Perfect hashing (c'est-à-dire que vous pouvez distribuer les paramètres du hachage au lieu de la liste complète des propriétés/fichiers).

Une méthode très grossière (mais peut-être fonctionnelle) aurait quelques fonctions de hachage différentes (h1, h2 ...); commencer par exemple avec str.hash() et calculez les hachages. S'il y a des collisions, essayez d'utiliser un tuple (h1 (propriété), h2 (propriété)) comme un hachage. S'il y a encore des collisions, utilisez (h1 (propriété), h2 (propriété), h3 (propriété)) - etc., jusqu'à ce qu'il n'y ait pas de collisions. Les fonctions h_x peuvent être en fait une fonction quelque peu configurable et la méthode recommandée serait d'essayer quelques fonctions de hachage aléatoires.

Cependant, il me semble que cela pourrait être surpuissant, juste distribuer la liste des fichiers/propriétés pourraient être beaucoup plus facile ...

+0

Le point entier d'un hachage est que vous le calculez à partir de la valeur, et que le hachage pour une valeur donnée ne change jamais. Vous ne pouvez pas continuer à changer le hachage jusqu'à ce qu'il ne se heurte pas. –

+0

Vous pouvez continuer à changer la fonction de hachage jusqu'à ce que les valeurs que vous êtes en hachage ne se chevauchent jamais et demander ensuite à tous les processus distribués d'utiliser cette fonction de hachage particulière. C'est ce qu'on appelle le hachage parfait; Je pense que c'est (ou du moins était) utilisé dans certains compilateurs pour compiler raisonnablement d'énormes déclarations de "cas". – ondra

+0

Il s'agit donc d'un hachage parfait ou d'un index? Je suppose que je vais coder les deux et voir ce qui semble le mieux, alors. – Paddy3118

0

Les hachages peuvent entrer en collision. Vous devrez considérer cela.

+0

Il n'y a donc pas de solution miracle :-) – Paddy3118