Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB.NET]Scrivere in contemporanea su un file .txt
Forum - C# / VB.NET - [VB.NET]Scrivere in contemporanea su un file .txt

Avatar
Dyango (Normal User)
Pro


Messaggi: 83
Iscritto: 02/01/2009

Segnala al moderatore
Postato alle 16:20
Giovedì, 21/04/2011
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 il 21/04/2011 alle 16:24


la saggezza di un uomo non dipende da quante cose sà ma da quante informazioni riesce a trovare
PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Up
2
Down
V
Segnala al moderatore
Postato alle 10:55
Venerdì, 22/04/2011
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.

Quando ho postato ero convinto che lui dovesse scrivere dei dati secondo un certo ordine, per quello parlavo di una classe che organizzava gli accessi - Question - 22/04/11 12:54


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2763
Iscritto: 21/09/2007

Up
0
Down
V
Segnala al moderatore
Postato alle 16:36
Giovedì, 21/04/2011

Spiega altri dettagli del tuo scenario, così più che dirti di usare uno streamwriter non posso fare :)


Ingegnere Informatico
https://ldlagency.it
PM
Avatar
Question (Normal User)
Rookie


Messaggi: 58
Iscritto: 14/12/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 17:27
Giovedì, 21/04/2011
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).


Ma ovviamente x64
PM
Avatar
Dyango (Normal User)
Pro


Messaggi: 83
Iscritto: 02/01/2009

Up
0
Down
V
Segnala al moderatore
Postato alle 18:26
Giovedì, 21/04/2011
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


la saggezza di un uomo non dipende da quante cose sà ma da quante informazioni riesce a trovare
PM
Avatar
Question (Normal User)
Rookie


Messaggi: 58
Iscritto: 14/12/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 20:02
Giovedì, 21/04/2011
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 il 21/04/2011 alle 20:09


Ma ovviamente x64
PM
Avatar
Dyango (Normal User)
Pro


Messaggi: 83
Iscritto: 02/01/2009

Up
0
Down
V
Segnala al moderatore
Postato alle 22:44
Giovedì, 21/04/2011
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)


la saggezza di un uomo non dipende da quante cose sà ma da quante informazioni riesce a trovare
PM