IOException Lese eine große Datei von einem UNC-Pfad in eine Array-Byte unter Verwendung von .NET

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

Frage

Ich verwende den folgenden Code, um zu versuchen, eine große Datei (280 MB) in ein Byte-Array von einem UNC-Pfad zu lesen

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;
    }
}

Dies wird mit dem folgenden Fehler Sprengung.

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

Wenn ich laufen diese einen lokalen Pfad verwenden es funktioniert gut, in meinem Testfall der UNC-Pfad tatsächlich auf das lokale Feld zeigt.

Alle Gedanken, was hier los ist?

War es hilfreich?

Lösung

Ich vermute, dass etwas weiter unten versucht, in einer anderen Puffer zu lesen, und all 280MB in einem Rutsch lesen versagt. Es kann im Netzwerk Fall erforderlich mehr Puffer als im lokalen Fall.

Ich würde etwa 64 K zu einem Zeitpunkt lesen, anstatt zu versuchen, die ganze Menge auf einmal zu lesen. Das ist genug, um zu viel Aufwand zu vermeiden, von Chunking, werden aber vermeiden riesige Puffer erforderlich ist.

Persönlich neige ich dazu nur eher zum Ende des Stroms gelesen als unter der Annahme, dass die Dateigröße konstant bleiben wird. Siehe diese Frage für weitere Informationen.

Andere Tipps

Auch, wie der Code muss geschrieben, um die FileStream in einen using Block setzen. Andernfalls die Ressourcen zu entsorgen ist ein sehr möglicher Grund für „nicht genügend Systemressourcen“ Empfangen:

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;
        }
    }
}

Es sieht aus wie das Array nicht mit ausreichender Größe erstellt wurde. Wie gross eines Arrays zugeordnet ist, bevor sie in weitergegeben? Oder waren vorausgesetzt, Sie die Read-Funktion würde die Datenarray umverteilen nach Bedarf? Es wird nicht. Edit: Er, vielleicht auch nicht, ich habe gerade bemerkt, die Ausnahme Sie. Nicht sicher jetzt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top