View Full Version : consiglio di implementazione
huntercity
03-07-2002, 15:02
devo fare un progetto per l'università che mi si presenta
più difficile di quanto immaginassi
devo realizzare un software che mi tenga sincronizzate due directory su due macchine in rete, o anche sulla stessa macchina
del tipo sincronizza hostA:dir1 hostB:dir2
ho iniziato ad affrontare la fase progettuale e la mia idea era quella di crearsi una struttura dati con tutte le entry della directory e sottodirectory di dir 1 e di dir2 per poi andare a fare un confronto per vedere se matchavano i nomi dei file
Se matchano controllo le date per vedere chi è piu giovane e nel caso di dimensione uguale controllo l'MD5 e poi decido chi copiare da una parte all'altra
Se non matchano vuol dire che un file non esiste nell'altra directory e quindi lo copio direttamente
Ho due problemi
se in dir1 ci sono M elementi tra file e directory e in dir2 ci sono N elementri tra file e directory devo fare un controllo M*N che nel caso di tanti file è quasi improponibile
allora un mio amico mi ha detto di ordinare le due strutture e poi confrontare e in questo caso il confronto è un confronto lineare, ma ci devo mettere il tempo dell'ordinamento
quindi M+N+MlogM + NlogN
comunque è sempre meglio di N*M
voi direte tutto ok
e invece no
nel caso di non ordinamento per non avere problemi di memoria e per non dovermi sbattere ad usare le liste, la struttura che mi creavo sulle informazione di ogni entry (cioè nome_file, dataultimamodifica, dimensione e md5) le andavo a scrivere dentro un file e cosi risolvevo tutto
Se invece voglio usare l'ordinamento per usare QSORT ho bisogno di un'array ma mi si presenta il problema che dovrei dimensionarlo in modo statico e quindi non sempre va bene perchè potrei incontrare directory di dimensioni superiori a quanto io ho dimensionato il mio array
secondo voi ci sono altre alternative??
grazie
PS:lo so che è lungo e macchinoso ma se qualcuno ci capisce e mi rispondo gliene sono grato
ciao
/\/\@®¢Ø
05-07-2002, 21:31
Ciao ,
Perchè dovresti dimensionare l'array staticamente ? Non potresti usarne uno dinamico ? Avresti praticamente risolto i tuoi problemi
Che linguaggio stai usando ? ( a naso sembrerebbe C o C++ ... )
huntercity
05-07-2002, 23:19
Originariamente inviato da /\/\@®¢Ø
[B]Ciao ,
Perchè dovresti dimensionare l'array staticamente ? Non potresti usarne uno dinamico ? Avresti praticamente risolto i tuoi problemi
Che linguaggio stai usando ? ( a naso sembrerebbe C o C++ ... )
sarebbe ottimo avere un array dinamico
ma come me lo creo??
eppoi con le dimensioni come la metto??
se mi capita di dover sincronizzare una directory con 6000 entry o di piu mi serve in memoria una array da paura
eppoi a priori non so quante entry devo creare come me lo creo l'array dinamicamente senza impiccarmi con le liste??
grazie
devo utilizzare C sotto linux
/\/\@®¢Ø
05-07-2002, 23:40
In C lo puoi fare allocando della memoria 'grezza' con malloc.
Ad esempio se vuoi un array di 1000 interi puoi fare così
int *x;
...
x = (int*) malloc( 1000*sizeof( int ) );
Ora x lo puoi usare come un normale array di interi. Nella chiamata ricordati di moltiplicare il numero di elementi che ti servono per la dimensione delle strutture che usi ( int nell'esempio, ma puoi sostituirlo con la struttura che vai ad usare )
quando hai finito di usare l'array liberi la memoria con una chiamata a free:
free( x );
La memoria occupata non dovrebbe essere un grosso problema. Dipende da che informazioni poi memorizzi , supponendo circa 100 byte per nome del file, data/ora , dimensione etc., per 6000 files in una directory ti troveresti all'incirca 600kB di memoria occupata. Non mi sembra una quantita' enorme :)
huntercity
06-07-2002, 00:00
Originariamente inviato da /\/\@®¢Ø
[B]In C lo puoi fare allocando della memoria 'grezza' con malloc.
Ad esempio se vuoi un array di 1000 interi puoi fare così
int *x;
...
x = (int*) malloc( 1000*sizeof( int ) );
Ora x lo puoi usare come un normale array di interi. Nella chiamata ricordati di moltiplicare il numero di elementi che ti servono per la dimensione delle strutture che usi ( int nell'esempio, ma puoi sostituirlo con la struttura che vai ad usare )
quando hai finito di usare l'array liberi la memoria con una chiamata a free:
free( x );
La memoria occupata non dovrebbe essere un grosso problema. Dipende da che informazioni poi memorizzi , supponendo circa 100 byte per nome del file, data/ora , dimensione etc., per 6000 files in una directory ti troveresti all'incirca 600kB di memoria occupata. Non mi sembra una quantita' enorme :)
non ci siamo capiti
lo so che in C con le malloc mi alloco memoria dinamica
il problema è che per esempio io non conosco il valore
di quanto devo allocare
nel senso che non conosco quel 10000
io uso una procedura sdir(char * nomedir)
che mi fà una opendir(nomedir) e poi inizia a leggere con le readdir le entry della directory, appena trova una entry che è una directory entra in ricorsione altrimenti devo memorizzare la entri nel mio array, solo che non so quante entry devo memorizzare poichè non so quante sono le sottodirectory e file che ci sono dentro
hai capito qual'è il mio problema?
potrei anche fare prima una routine tipo sdir che mi dice quanti sono le entry e poi alloco e faccio un'altra scansione ma in questo modo devo scandire il filesystem 2 volte, con il problema anche che nel frattempo puo darsi che qualcuno ha creato un nuovo file e quindi il mio numero di prima non è piu' buono e alloco un array che poi nella seconda passata non è sufficiente
ciao
huntercity
06-07-2002, 10:44
Originariamente inviato da cionci
[B]Ma una lista ? http://spazioinwind.iol.it/spagoland/images/dire.gif
mi tornerebbe male usare una lista, poichè vorrei
qualcosa di ordinato per fare piu infretta, a meno che le mie
considerazioni non siano sbagliate
io ho una situazione come in figura
devo sincronizzare le due directory sui due host
allora mi creo le due strutture di A e B
poi la mia idea era di lanciare un thread per ogni entry della struttura dell'hostA che controllasse tutte le entry dell'hostB per vedere se c'era corrispondenza o no
nel caso di corrispondenza controllavo data e ora per decidere chi era piu aggiornato, poi scrivo in una coda cosa devo fare (la coda verra processata dopo aver finito tutti i confronti)
ne caso di non corrispondenza scrivo nella coda di copiare il file nel rispetto host in cui non si trova
sicuramente non lancio i thread tutti in una volta perchè se ho 5000 file e lancio 5000 thread mi scoppia tutto, quindi ne lancio MAX_THREAD alla volta
facendo il confronto in questo modo ho una complessità di tipo MxN
invece avendo due strutture ordinate la complessità si riduce notevolmente in quanto non devo riscandirmi ogni volta in ogni thread la struttura dell'hostB e anzi credo che non ci servano neanche i thread in quanto mi sembra che la scansione sia di tipo lineare
il problema nasce dal fatto che per usare la QSORT devo avere un array da ordinare e purtroppo io non so come dimensionare l'array in quando non so la dimensione a priori, si potrebbero usare giustamente le liste ma in quel caso perdo l'ordinamento e quindi mi aumenta la complessità di calcolo
--------------------------------------------------------------------------
altro quesito
io le due strutture avevo intenzione di usarle tutte e due sull'hostA, nel senso che chiedo ad hostB di crearsi la struttura, poi me la faccio mandare via socket e quindi il confronto lo faccio direttamente su hostA senza a stare ogni volta a spedire via socket le richieste dei confronti
E' una buona idea oppure sbaglio?
---------------------------------------------------------------------------
chiusura del post chilometrico
secondo voi c'è un'altro modo per confrontare due directory??
grazie
huntercity
06-07-2002, 10:50
Originariamente inviato da huntercity
[B]http://spazioinwind.iol.it/spagoland/images/dire.gif
mi tornerebbe male usare una lista, poichè vorrei
qualcosa di ordinato per fare piu infretta, a meno che le mie
considerazioni non siano sbagliate
io ho una situazione come in figura
devo sincronizzare le due directory sui due host
Quindi :
mi creo le due strutture di A e B
poi la mia idea era di lanciare un thread per ogni entry della struttura dell'hostA che controllasse tutte le entry dell'hostB per vedere se c'era corrispondenza o no
nel caso di corrispondenza controllo data e ora per decidere chi era piu aggiornato, poi scrivo in una coda cosa devo fare (la coda verra processata dopo aver finito tutti i confronti)
ne caso di non corrispondenza scrivo nella coda di copiare il file nel rispettivo host in cui non si trova
sicuramente non lancio i thread tutti in una volta perchè se ho 5000 file e lancio 5000 thread mi scoppia tutto, quindi ne lancio MAX_THREAD alla volta
facendo il confronto in questo modo ho una complessità di tipo MxN
invece avendo due strutture ordinate la complessità si riduce notevolmente in quanto non devo riscandirmi ogni volta in ogni thread la struttura dell'hostB e anzi credo che non ci servano neanche i thread in quanto mi sembra che la scansione sia di tipo lineare
il problema nasce dal fatto che per usare la QSORT devo avere un array da ordinare e purtroppo io non so come dimensionare l'array in quando non so la dimensione a priori, si potrebbero usare giustamente le liste ma in quel caso perdo l'ordinamento e quindi mi aumenta la complessità di calcolo
--------------------------------------------------------------------------
altro quesito
io le due strutture avevo intenzione di usarle tutte e due sull'hostA, nel senso che chiedo ad hostB di crearsi la struttura, poi me la faccio mandare via socket e quindi il confronto lo faccio direttamente su hostA senza a stare ogni volta a spedire via socket le richieste dei confronti
E' una buona idea oppure sbaglio?
---------------------------------------------------------------------------
chiusura del post chilometrico
secondo voi c'è un'altro modo per confrontare due directory??
grazie
La lista la puoi ordinare comunque...anche se è un procedimento più lento di un QSORT...
Oppure fai la lista man mano che scorri le entry della dir...e ti conti le entry...
Finito questo processo ti puoi creare un array dalla lista ed ordinartelo come vuoi...
PS: la gif non si vede...errore 404...
huntercity
06-07-2002, 12:00
Originariamente inviato da cionci
[B]La lista la puoi ordinare comunque...anche se è un procedimento più lento di un QSORT...
Oppure fai la lista man mano che scorri le entry della dir...e ti conti le entry...
Finito questo processo ti puoi creare un array dalla lista ed ordinartelo come vuoi...
PS: la gif non si vede...errore 404...
come idea non è male
io avevo pensato anche ad un file
nel senso che invece di crearmi una lista le info le scrivevo
nel file e poi usavo SORT, solo che è programma di linux e non so se il prof si incazza
PS:adesso l'immagine va
/\/\@®¢Ø
06-07-2002, 14:55
Originariamente inviato da huntercity
[B]
non ci siamo capiti
lo so che in C con le malloc mi alloco memoria dinamica
il problema è che per esempio io non conosco il valore
di quanto devo allocare
nel senso che non conosco quel 10000
Ok scusami ! :)
Potresti allocarne uno con una prefissata una dimensione iniziale ( per 100 elementi ad esempio ), e controllarne quanto ne usi. Quando la riempi, con realloc aumenti le dimensioni ( le raddoppi ad esempio ) e continui nel nuovo spazio.
ad esempio per leggere un numero precisato di interi
int size,i;
int *x;
i=0;
size = 100;
x=malloc( size*sizeof(int) );
while( /* ci sono ancora valori da leggere */ )
{
if ( i == size )
{
size*=2;
x = realloc( x , size * sizeof(int) );
}
x[ i++] = "prossimo intero letto";
}
Non l'ho provato, ma la cosa dovrebbe funzionare...
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.