Ho un problema quando scrivo una grande quantità di dati < 2GB in un file. I primi dati da 1,4 GB vengono scritti velocemente (100 MB/s) rispetto a quando il codice diventa molto lento (0-2 MB/s).Scrive dati di grandi dimensioni per il problema di memorizzazione nella cache dei file
Il mio codice (semplificato) è:
//FileOptions FILE_FLAG_NO_BUFFERING = (FileOptions)0x20000000;
FileOptions fileOptions = FileOptions.SequentialScan;
int fileBufferSize = 1024 * 1024;
byte[] Buffer = new byte[32768];
Random random = new Random();
long fileSize = 2588490188;
long totalByteWritten = 0;
using (FileStream fs = File.Create(@"c:\test\test.bin", fileBufferSize, fileOptions))
{
while (totalByteWritten < fileSize)
{
random.NextBytes(Buffer);
fs.Write(Buffer, 0, Buffer.Length);
totalByteWritten += Buffer.Length;
//Thread.Sleep(10);
}
}
io ci credo sia un problema relativo al problema di caching, infatti durante "le prestazioni in scrittura veloce" RAM utilizzata aumento così, quando l'arresto utilizzo della RAM per aumentare lì è un calo di prestazioni.
Quello che ho cercato:
modifica asincrona scrittura -> Nessun cambiamento significativo
cambiamento matrice di dimensione del buffer -> cambiare senza significativamente
cambiamento
fileBufferSize
- > nessun cambiamento significativo, ma con un buffer di grandi dimensioni ~ 100 MB, le prestazioni in scrittura sono veloci e quando l'utilizzo della RAM si ferma per aumentare, scrivi p erformance va a 0 e poi, dopo un po ', risale a 100 MB, cuciture che buffer della cache è "arrossato"cambiamento
fileOption
-WriteThrough
-> prestazioni sono sempre lento ..aggiungendo dopo xx loop
fs.Flush(true)
-> cambio No significativamenteuncomment
Thread.Sleep(10)
-> velocità di scrittura è sempre bene ..... questo è strano
sembra che thread.sleep stia aiutando la memoria a essere cancellata e scaricata sul disco. puoi fare un punto di riferimento della tua velocità di scrittura hd? Penso che all'inizio tutto venga scritto in memoria, finché non è pieno e quindi viene scritto sia il file di paging di Windows (dato che si è esaurita la memoria) che il file continua a scrivere, quindi le prestazioni si stanno abbassando. ma potrei sbagliarmi :) – Dementic
C'è qualche possibilità che ci sia qualche software anti-virus in esecuzione sul sistema che rallenti le prestazioni dopo che la RAM è piena e i dati inizino a essere scritti su disco? –
Hm, a mio avviso'FileOptions.SequentialScan' non ha alcun senso nel tuo scenario. Questo sarebbe importante quando * lettura * da disco non scrive. Per quanto ho capito, questo è solo uno snippet di codice semplificato, quindi suppongo che'random.NextBytes' sia solo un segnaposto per i tuoi dati reali. Da dove vengono i dati reali? Riuscire a raccogliere i dati reali è il colpevole? –