Newsgroup: it.comp.lang.perl
Titolo: Algoritmi di confronto tabelle.

Ciao,
scusate, forse questa domanda è poco inerente con il PERL specifico, però lo
devo implementare in perl quindi...
Il mio problema che tento di risolvere inutilmente da un po' di tempo è il
seguente:
-Ho una lista di HASH (MD5 di 16byte l'uno)
-Le tabelle possono essere molto grandi, anche 50.000 HASH
-Tramite due client che si parlano per mezzo di una connessione TCP devo far
aggiornare i due database dei due client in modo che si completino.
Il numero degli HASH può essere variabile, alcuni possono non averne punti e
altri averne migliaia.
Non posso spedire la lista completa degli HASH perchè sarebbero pacchetti di
qualche MB e non mi sembra proprio il caso.
Il tutto dovrebbe funzionare con pochi passaggi, ossia io non devo ricevere
e rispondere pacchetti per 20 volte con pacchetti di pochi byte perchè
sarebbe molto lento. Più veloce sarebbe spedire pacchetti magari anche di
20KB e risolverlo in un paio di passaggi, sarebbe decisamente più veloce.
(le adsl hanno tutte il ping alto)
Io, nel caso non si trovasse una soluzione, ne avrei una che però sembra
poco robusta.
In pratica, io creo un vettore, ad esempio di 1000 celle.
Quando ricevo un nuovo hash non faccio altro che eseguire questa serie di
istruzioni:
$VETTORE[ CRC16( $HASH_MD5 ) % 1000] ++;
push($VETTORE_CON_HASH[ CRC16( $HASH_MD5 ) % 1000 ], $HASH_MD5);
Quando dovrò trovare gli HASH che mi mancano seguirò questa serie di
istruzioni:
-Chiedo all'altro client il suo vettore (ogni cella è 2byte,unsigned short,
e quindi il pacchetto sarebbe solo 2000byte)
-Confronto il suo vettore con il mio e mi annoto le celle che sono più
grandi delle mie.
- Richiedo gli HASH che hanno incrementato le celle che mi sono annotato
prima.
- L'altro client mi spedisce gli HASH della cella o celle X e io considero
solo gli hash che mi mancano.
In questo modo potrei diminuire il carico ma per ora non sembra essere un
sistema che regge molto. Sicuramente questo tipo di problema è già stato
sffrontato e risolto magari brillantemente da altre menti.
Help me plz!
grazie in anticipo ^_^

sffrontato e risolto magari brillantemente da altre menti.
Certo che sì, al punto di generare un'intera disciplina, direi
(database distribuiti).
A me sembra che il meccanismo utilizzato dai server nntp per
condividere i messaggi potrebbe funzionare: ogni tot un server
annuncia all'altro che ha nuovi hash da comunicare ("IHAVE"); il
traffico è quindi limitato ai soli nuovi hash generati dall'ultimo
collegamento (anche se questo non elimina del tutto la possibilità che
venga trasmesso un hash già in possesso dell'altro server). Non sono
sicuro di aver compreso il tuo sistema dei vettori, quindi non so dire
quale dei due sia più dispendioso. Certamente un sistema che coinvolga
la trasmissione dell'intera tabella (o dell'intera tabella dei digest)
dovrebbe dare garanzie maggiori sulla sincronia del sistema, al costo
di un possibile maggior traffico.
Ciao.

 ha scritto nel messaggio
news:kmu0i0570sp7mjd0l...@4ax.com...

Ciao, intanto grazie per avermi risposto.
Più che altro il mio problema è che i nodi di questo sistema possono non
collegarsi per settimane, oppure collegarsi per la prima volta dopo un anno
di attività del sistema.
CMQ, probabilmente ho trovato un modo per risolvere il caso e dopo il test
sembra funzionare anche se non l'ho provato su larga scala.
Il perl è fantastico, peccato che una volta avviato prenda 33MB di memoria
:°°
Ciao ^^

Il perl è fantastico, peccato che una volta avviato prenda 33MB di memoria
Immagino dipenda da quello che fai: sono sicuro che i miei filtrini
hanno un profilo inferiore di circa un ordine di grandezza.
Ciao.

 Ciao.
Filtrini?
Cosa è questa cosa?
CMQ. probabilmente ho risolto il problema con il più vecchio dei metodi Ora
guardo se funziona.
Grazie dell'aiuto^^

Cosa è questa cosa?
Un "filtrino" è un piccolo filtro: qualcosa che ci metti dentro della
roba da una parte, ed esce dell'altra roba dall'altra parte (un filtro);
però piccolo (filtrino).
Esempio minimo (e abbastanza insulso):
    while (<>) {
      print;
    }
Molto di quello che faccio quotidianamente in Perl è classificabile come
"filtrino" (un po' meno insulso dell'esempio, naturalmente, o così mi
auguro). L'occupazione di memoria di solito non supera i 3-4Mbyte.
Ciao.
-- 
Ciao.
Pierluigi

Scusa, ero in ferie.
Perň a me non prende 34MB per via delle variabili, ma per via dei moduli che
richiedo.
Uso ad esempio il modulo crypt::rsa per windows che solo quallo mi fa
aumentare la dim. dell'eseguibile di un paio di MB e non č poco.
Di variabili ne ho poche, una dell'accesso al Databse in DBM e gli altri
sono socket.
CI sono poi poche varibili temporanee ma si ditruggono subito.
CMQ, forse diminuirň lo spazio di memoria occupata perchč, nel progetto
originale il programma si divideva in 3 thread piů il padre che li gestiva.
- Server
- Client
- Webserver
- Gestione dei tre processi
Ora ho visto che posso farlo in 2 thread incluso il padre:
- Server&Client (il padre)
- Webserver (il figlio)
Speriamo funzioni :D