IOException la lecture d'un fichier de grande taille à partir d'un chemin UNC dans un tableau d'octets en utilisant .NET

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

Question

Je suis en utilisant le code suivant pour tenter de lire un fichier volumineux (280MB) dans un tableau d'octets à partir d'un chemin 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;
    }
}

Ce souffle avec l'erreur suivante.

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

Si je lance cela en utilisant un chemin local, il fonctionne très bien, dans mon cas de test le chemin UNC est en fait la pointe vers la boîte locale.

Toutes les pensées que se passe ici?

Était-ce utile?

La solution

Je soupçonne que quelque chose plus bas essaie de lire dans un autre tampon, et la lecture de tous 280MB en une seule fois est un échec. Il peut y avoir plusieurs tampons nécessaires dans le cas du réseau que dans le cas local.

Je lirais au sujet de 64K à la fois au lieu d'essayer de lire le lot entier en une seule fois. Cela suffit pour éviter trop de frais généraux de Chunking, mais évitera d'énormes tampons étant requis.

Personnellement, je tendance à lire juste la fin du cours d'eau plutôt que de supposer que la taille du fichier reste constant. Voir cette question pour plus d'informations.

Autres conseils

En outre, le code comme écrit doit mettre le FileStream dans un bloc de using. A défaut de disposer des ressources est une raison possible pour recevoir « des ressources système insuffisantes »:

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

On dirait que le tableau n'a pas été créé avec une taille suffisante. Quelle est la taille d'un tableau est alloué avant d'être adoptée en? Ou étiez-vous assumez la fonction de lecture réallouerait le tableau de données au besoin? Il ne sera pas. Edit: Er, peut-être pas, je viens de remarquer l'exception que vous avez obtenu. Je ne sais pas maintenant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top