|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jun 2001
Città: Pisa
Messaggi: 628
|
consiglio di implementazione
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 |
|
|
|
|
|
#2 |
|
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
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++ ... ) |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Jun 2001
Città: Pisa
Messaggi: 628
|
Quote:
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 |
|
|
|
|
|
|
#4 |
|
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
In C lo puoi fare allocando della memoria 'grezza' con malloc.
Ad esempio se vuoi un array di 1000 interi puoi fare così Codice:
int *x; ... x = (int*) malloc( 1000*sizeof( int ) ); quando hai finito di usare l'array liberi la memoria con una chiamata a free: Codice:
free( x ); |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jun 2001
Città: Pisa
Messaggi: 628
|
Quote:
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 |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ma una lista ?
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Jun 2001
Città: Pisa
Messaggi: 628
|
Quote:
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 |
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Jun 2001
Città: Pisa
Messaggi: 628
|
Quote:
|
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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... |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Jun 2001
Città: Pisa
Messaggi: 628
|
Quote:
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 |
|
|
|
|
|
|
#11 | |
|
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Quote:
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 Codice:
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";
}
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:32.



















