6
votes

Mise en œuvre de l'algorithme de rapprochement défini

Je recherche des implémentations d'algorithme de rapprochement défini. Le problème suit: Il existe deux ensembles avec des éléments identifiés par une valeur relativement compacte (E.G. UUID ou MD5 / SHA1 / Quelque hachage) assis sur différentes machines. Ces ensembles diffèrent dans relativement peu d'éléments et je souhaite synchroniser ces ensembles tout en transférant une quantité minimale de données. La plupart de Googling dirige ici . C'est la mise en œuvre de la GPL'D de ce qui semble être l'approche de pointe de la tâche. Le problème est que je ne peux pas utiliser le code GPLL'D dans mon application. Très probablement, je vais devoir le réimplémenter moi-même en utilisant quelque chose comme NZMATH, mais il existe peut-être d'autres implémentations (de préférence python ou C / C ++), ou peut-être qu'il y a d'autres algorithmes plus agréables?


7 commentaires

Ne pouviez-vous pas simplement mettre les clés dans un fichier (triées) et le rsync?


Tonfa: C'est l'une des solutions possibles, mais elle n'exploit pas le fait que la commande de données n'a pas d'importance. De plus, les valeurs ajoutées / supprimées seront réparties de manière uniforme dans le fichier, ce qui entraînera une algorithme RSYNC de transférer de nombreux données en excès (peut-être un bloc par telle valeur).


Au moment de l'exécution, il y aura une liaison connue sur la taille possible des différences?


Avec quelle taille sont les ensembles avec qui vous travaillez? Avez-vous vraiment besoin d'utiliser l'état de la technique? Ou pouvez-vous simplement calculer la différence définie et transférer uniquement ces éléments?


BTW n'est pas clair si vous souhaitez transmettre les clés ou les données attachées aux clés (j'ai assumé les clés). Une solution possible (approximation) serait d'utiliser un filtre de floraison: en.wikipedia.org/wiki/ ...


Lost-Théorie: Une des choses que cela sera utilisé pour la synchronisation du stockage adressable de contenu simple pouvant contenir plus de millions de fichiers clés par leur MD5Sum. C'est environ 16 Mo à transférer les deux sens. Et si je veux le faire sur la connexion GPRS Pay-Per-Byte?


Tonfa: Oui, je sais sur les filtres de floraison, c'est l'une des possibilités que je considère à utiliser si je n'ai pas le temps de mettre en œuvre l'algorithme polynomial. Une autre possibilité est d'utiliser quelque chose sur les lignes de Algorithme de synchronisation de la base de données .


3 Réponses :


1
votes

ne pas pouvoir utiliser GPL est souvent une question d'abstraction; C'est si c'est la licence que vous avez des problèmes. Donc, si vous créez une petite application GPL (publiée sous GPL), vous pouvez appeler cela à partir de votre application non-GPL. Pourquoi réinventer la roue?

Surtout si vous pouvez utiliser un script Python qui existe déjà: pourquoi ne pas le tirer parti? Bien sûr, les choses sont différentes si vous ne pouvez pas exposer les algorithmes de reconsolidation des éléments.


2 commentaires

J'ai envisagé de faire cela, mais je me sens en quelque sorte mal à propos de la solution de contournement GPL, car une application GPL'D résultante sera plutôt inutile sans qu'il s'agisse d'un emballage UNGPL'D.


Il serait toujours conforme à GPL. D'autres personnes peuvent réutiliser des idées, donc cela correspond toujours aux idées GPL. Il bat de réinventer la roue imho.



1
votes

Ce code est sorti de ma tête, et donc couvert par la licence qui s'applique aux échantillons de code sur ce site.

for opcode, datum in set_reconcile(machine1_stuff, machine2_stuff):
    if opcode == 'create':
        # act accordingly
    elif opcode == 'delete':
        # likewise
    else:
        raise RuntimeError, 'unexpected opcode'


3 commentaires

Ok, mais vous n'avez pas les deux ensembles sur aucune des machines, c'est le problème.


Si vous ne pouvez pas transférer la liste des touches d'une machine, comment allez-vous transférer les articles? Veuillez spécifier votre objection (s'il en est un). Vous avez demandé au code non GPL pour réconcilier deux ensembles, je n'ai pas vu de demande de code qui gère les transferts vers et fro, transférés des éléments d'identité ou d'éléments uniques.


La chose est que si vous avez deux grands ensembles de clés telles que des uuids assises sur différentes machines, il existe une truc qui permet d'obtenir par exemple. Union de ces ensembles des deux côtés sans trop passer de données (voir lien dans la question). Que se passe-t-il après que les listes de clés complètes sont obtenues des deux côtés est triviale et donc de peu d'intérêt pour moi.



0
votes

the Synchronisation KeyServer Project implémente le rapprochement efficace de jeu dans OCAML.


2 commentaires

Êtes-vous si la mise en œuvre du protocotol peut être trouvée dans quelque chose de non OCAML?


J'ai une version C ++ disponible librement à Nislab.bu.edu.