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] FileStream via LAN
Forum - C# / VB.NET - [VB.NET] FileStream via LAN

Avatar
Molin Mauro (Member)
Rookie


Messaggi: 47
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 17:58
Lunedì, 06/02/2012
Ciao a tutti!
Devo scrivere un file vuoto (mi serve per effettuare una specie di "benchmark") su un altro PC nella stessa LAN. Pensavo di usare il metodo IO.FileStream
Questo è il mio codice inserito in un BackgroundWorker:
Codice sorgente - presumibilmente VB.NET

  1. Dim a As New IO.FileStream(TextBox1.Text & "testfile", IO.FileMode.Create)
  2.         For i As Long = 0 To max - 1
  3.             a.WriteByte(1)
  4.             b = i
  5.         Next
  6.         a.Close()



La variabile 'max' contiene, in byte, la grandezza del file da scrivere e la variabile 'b' mi serve per mostrare una ProgressBar.

Il mio problema è che se eseguo questo software per scrivere in un Hard Disk locale va molto veloce (oltre 100 MB/s) ma se provo a dargli una posizione LAN (come \\192.168.1.9\Condivisione) scrive all'imbarazzante velocità di 3MB/s, quando so di per certo che dovrei fare perlomeno 9-10MB/s.
Inoltre, passando il programma ad un mio amico che ha la LAN Gigabyte (molto più veloce di quella tradizionale) gli va a soli 6MB/s.

Ho controllato l'utilizzo di CPU del processo mentre scrive ed è a 1-2%, quindi più o meno nella norma.

Cosa sbaglio? C'è un metodo più efficente per scrivere un file in LAN?

Grazie anticipatamente delle risposte,
Mauro ;)

Ultima modifica effettuata da Molin Mauro il 06/02/2012 alle 18:01


PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Up
1
Down
V
Segnala al moderatore
Postato alle 11:39
Martedì, 07/02/2012
Sicuramente una parte della colpa è da imputare alla funzione WriteByte. Non devi scrivere un byte alla volta, ma un buffer completo (solitamente 1, 2, 4 o 8 KiB). Altrimenti le trasmissioni hanno troppo overhead.
Inoltre penso che l'invio avvenga di default tramite TCP, quindi c'è da considerare tutti i meccanismi di controllo di flusso di livello 4. Ovviamente non arriverai mai a sfruttare tutta la capacità del canale sottostante.

P.S.: ricordati di convertire da B/s a b/s. 6B/s sono 48Mbit/s. Considera anche che non tutta la banda è a disposizione per il tuo livello applicativo. Ci sono altri processi che verosimilmente usano la stessa interfaccia di rete e poi ci sono i vari protocolli di routing e spanning tree i cui pacchetti viaggiano per la sottorete.


"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