IOException la lettura di un file di grandi dimensioni da un percorso UNC in un array di byte utilizzando .NET

StackOverflow https://stackoverflow.com/questions/386088

Domanda

Sto usando il seguente codice per tentare di leggere un file di grandi dimensioni (280MB) in un array di byte da un percorso UNC

public void ReadWholeArray(string fileName, byte[] data)
{
    int offset = 0;
    int remaining = data.Length;

    log.Debug("ReadWholeArray");

    FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read);

    while (remaining > 0)
    {
        int read = stream.Read(data, offset, remaining);
        if (read <= 0)
            throw new EndOfStreamException
                (String.Format("End of stream reached with {0} bytes left to read", remaining));
        remaining -= read;
        offset += read;
    }
}

Questa è saltare in aria con il seguente errore.

System.IO.IOException: Insufficient system resources exist to complete the requested 

Se corro questo utilizzando un percorso locale che funziona bene, nel mio caso di test il percorso UNC è in realtà rivolta alla casella locale.

Ogni pensiero che cosa sta succedendo qui?

È stato utile?

Soluzione

Ho il sospetto che qualcosa più in basso sta cercando di leggere in un altro buffer, e la lettura di tutti i 280MB in un colpo solo sta fallendo. Ci possono essere più buffer richieste nel caso di rete che nel caso locale.

Vorrei leggere su 64K alla volta invece di cercare di leggere l'intero lotto in una volta sola. Questo è sufficiente per evitare troppa testa dalla suddivisione in blocchi, ma eviterà enormi buffer che siano necessarie.

Personalmente tendo a leggere solo alla fine del flusso, piuttosto che assumendo che la dimensione del file rimarrà costante. Vedi questa domanda per ulteriori informazioni.

Altri suggerimenti

Inoltre, il codice come scritto ha bisogno di mettere il FileStream in un blocco using. Non riuscendo a disporre di risorse è una possibile ragione per la ricezione di "Risorse di sistema insufficienti":

public void ReadWholeArray(string fileName, byte[] data)
{
    int offset = 0;
    int remaining = data.Length;

    log.Debug("ReadWholeArray");

    using(FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
    {
        while (remaining > 0)
        {
            int read = stream.Read(data, offset, remaining);
            if (read <= 0)
                throw new EndOfStreamException
                    (String.Format("End of stream reached with {0} bytes left to read", remaining));
            remaining -= read;
            offset += read;
        }
    }
}

Sembra che la matrice non è stato creato con dimensioni sufficienti. Quanto è grande di un array è allocato prima di essere passato in? O stavi assumendo la funzione Read avrebbe allocare la matrice di dati, se necessario? E non lo farà. Edit: Ehm, forse no, ho appena notato l'eccezione che hai. Non è sicuro ora.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top