Oppure

Loading
21/04/11 14:20
Dyango
ciao ragazzi mi stavo domandando se è possibile scrivere (attraverso 2 thread dello stesso programma) in contemporanea su un txt ?
ho una gran mole di dati da scrivere e sto cercando una soluzione efficace per impiegarci meno tempo possibile cosa mi consigliate?
Ultima modifica effettuata da Dyango 21/04/11 14:24
aaa
21/04/11 14:36
HeDo

Spiega altri dettagli del tuo scenario, così più che dirti di usare uno streamwriter non posso fare :)
aaa
21/04/11 15:27
Question
Se parliamo di soli 2 thread, potresti organizzare le varie intermittenze tramite un blocco SyncLock o, ma non mi sembra il caso, tramite un Mutex e così via.

Se si tratta di tre o più thread allora devi organizzarti una classe che se ne occupi, io l'ho fatto un po' di tempo fa e non avrei problemi a fornirti il codice (che per la cronaca è già commentato e non supera le 30 righe).

Comunque, non sono mica sicuro che la velocità di scrittura aumenti con l'aumentare dei thread :S
Penso che usarne uno solo ed evitare così il "blocco temporaneo" dell'applicazione sia sufficiente (insomma, lasciare che Windows elabori i suoi messaggi).
aaa
21/04/11 16:26
Dyango
data una parola in input la anagrammo e riverso il contenuto sul txt, per le parole brevi e con elementi ripetuti non ce problema ma se mi mette per esempio la parola informatica con la formula delle permutazioni con ripetizione viene 11*10*9*8*7*6*5*4*3*2/4 = 9.979.200 parole da scrivere, per questo stavo cercando il modo piu veloce possibile per scrivere su disco fisso, il multithreading è la prima idea che mi è venuta in mente potrebbe, in effetti, non portare nessun benificio concreto oltre a complicarmi la vita con la loro gestione.

p.s: question se vuoi posta pure la classe magari mi ritornerà utile in futuro
aaa
21/04/11 18:02
Question
Dando una letta su internet ho visto diverse persone che scrivevano di aver notato una maggiore velocità di I/O con funzioni vb6 e API rispetto a quella del framework.
Non ho verificato, ma se fossi in te proverei il benchmark con uno stopwatch.

Fammi sapere se ti va.
Ultima modifica effettuata da Question 21/04/11 18:09
aaa
21/04/11 20:44
Dyango
fatta la prova e devo dire che i risultati con le funzioni del vb sono di gran lunga più scadenti:

100.000 volte informatica
vb6: circa 4 sec
vb.net: circa 30 millisecondi

500.000 volte informatica
vb6: circa 20 sec
vb.net: circa 2 sec

comunque ce da dire che le funzioni vb6 scrivono ("informatica",) di conseguenza anche il file era piu grande mentre quelle vb.net solo (informatica)
aaa
22/04/11 8:55
Il Totem
Come diceva Question, dovresti usare SyncLock e Mutex. Funzionano con qualsiasi numero di thread: non c'è bisogno di implementare alcuna logica ulteriore rispetto al caso di 2 thread (poiché il lock è comunque sempre una condizione booleana).
E' un classico problema di serializzazione, in cui si deve limitare l'accesso a una risorsa condivisa tra più thread in parallelo. Sono sicuro che la frequenza delle operazioni aumenti almeno con un thread in più, per poi assestarsi su un asintoto con l'aumentare dei thread. Per massimizzare il guadagno dovresti inframezzare una parte consistente di elaborazione a una sola di scrittura: ad esempio ogni thread calcola 1000 parole prima di scriverle. Provaci.
aaa