Upload - FileStream oder ReadAllBytes?

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von high152.

    Upload - FileStream oder ReadAllBytes?

    Hi,

    ich hab grade etwas mit dem Hochladen von Dateien experimentiert und da bin ich doch gleich mal einer "System.OutOfMemoryException" begegnet.
    Das seltsame: ich hab auf meinem 64bit System noch genug von den 8GB frei gehabt.

    Ich denke dass es daran liegt, dass dich zuerst mit IO.File.ReadAllBytes() die Datei in eine Variable lese.

    Also wenn ich das jetzt richtig sehe verhalten sich ReadAllBytes und FileStream so:

    ReadAllBytes: Datei öffnen, Bytes einlesen, Datei schließen -> Bytes in die Variable speichern
    FileStream: Datei öffnen, "Türe auflassen" -> Zugang zu den Bytes in die Variable speichern

    Lieg ich da richtig?
    Dann wäre es ja am Speicher schonendsten den FileStream zu nehmen oder?

    Danke im Voraus!
    WriteAllBytes liest die komplette Datei in ein Byte-Array, welches dann im Speicher vorliegt.
    FileStream erlaubt es dir, die Datei teilweise einzulesen und sie dann auch teilweise zu verschicken.
    Ich würde an deiner Stelle also lieber einen FileStream nehmen.
    Ok, dacht ich mir schon fast, wollte nur sicher sein obs stimmt.

    Ist es möglich dass durch das komplette einlesen die Exception verursacht wurde?
    Oder anders gesagt:
    Sollte das mit FileStream und einem normal großen Buffer von 512/1024kb bei sehr guten Verbindung nicht passieren?

    high152 schrieb:

    Ist es möglich dass durch das komplette einlesen die Exception verursacht wurde?

    Ja, denn Du brauchst 1GB sequentiellen Speicher (=am Stück) im Hauptspeicher frei um das File zu speichern.

    high152 schrieb:

    Sollte das mit FileStream und einem normal großen Buffer von 512/1024kb bei sehr guten Verbindung nicht passieren?

    Du kannst auch grösseren Buffer nehmen, solange das im Rahmen bleibt sollte es keine Probleme geben.

    Weiterer Vorteil von der Streamvariante: beim StreamClose wird das File/der Filehandler wieder freigegeben. Bei IO.File.ReadAllBytes nicht

    Kangaroo schrieb:

    Weiterer Vorteil von der Streamvariante: beim StreamClose wird das File/der Filehandler wieder freigegeben. Bei IO.File.ReadAllBytes nicht

    Heißt das, dass die ReadAllBytes-Methode die Datei geöffnet lässt? Das macht eigentlich keinen Sinn, schließlich ist das Einlesen schon beendet.
    Nein, weder macht es Sinn noch ist es de facto so ( was bei .NET nicht immer gleich ist).

    Meinte es so daß Du den Zeitpunkt des Freigebens beim Stream selber bestimmst, beim ReadAllText oder ReadAllBytes nicht. Bin wohl heute zu müde.
    Bevor ich den Thread als erledigt markiere:

    Gibts so ne Art inoffizielle Grundregel für die Puffergröße?
    (Bspw 2MByte/s beim Hochladen -> 5*2 = 10MB Puffergröße)

    Edit: Egal, trotzdem danke!, ich werds probieren.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „high152“ ()