Wird bei DllImport die DLL-Datei pro Aufruf geladen ?



  • @Th69 sagte in Wird bei DllImport die DLL-Datei pro Aufruf geladen ?:

    Du meinst GB

    ja, natürlich

    Wie ist das eigentlich bei File.ReadAllBytes
    https://learn.microsoft.com/de-de/dotnet/api/system.io.file.readallbytes?view=net-6.0
    In dem Link werden die möglichen Ausnahmen aufgezeigt.
    Was passiert aber, wenn die Datei so groß ist, dass dafür kein byte[] Array im verfügbaren Speicher angelegt werden kann.
    Muss man das byte[] Array selbst wieder freigeben ?
    Ich benutze deshalb die max.Puffergröße von 1 GB, bei meinem derzeitigen RAM von 32 GB könnte es auch etwas mehr sein.
    Auf meinem PC gibt es aber Dateien, die deutlich größer als 1 TB sind.
    Eine Ausnahme sinngemäß "Datei für vorhandenen Speicher zu groß" habe ich nicht gefunden.

    07.09.2022  09:39    18.353.100.330 2022-09-06 xxx HD.mp4
    08.09.2022  16:22    17.293.742.949 2022-09-07 xxx HD.mp4
    09.09.2022  10:37    17.293.367.198 2022-09-08 xxx HD.mp4
    10.09.2022  07:32     8.115.634.344 2022-09-09 xxx HD.mp4
    22.09.2022  08:38     9.881.955.469 2022-09-21 xxx HD.mp4
    23.09.2022  07:25    15.526.817.738 2022-09-22 xxx HD.mp4
                   6 Datei(en), 86.464.618.028 Bytes
    


  • @hkdd sagte in Wird bei DllImport die DLL-Datei pro Aufruf geladen ?:

    @Th69 sagte in Wird bei DllImport die DLL-Datei pro Aufruf geladen ?:
    Wie ist das eigentlich bei File.ReadAllBytes
    https://learn.microsoft.com/de-de/dotnet/api/system.io.file.readallbytes?view=net-6.0
    In dem Link werden die möglichen Ausnahmen aufgezeigt.
    Was passiert aber, wenn die Datei so groß ist, dass dafür kein byte[] Array im verfügbaren Speicher angelegt werden kann.

    Dann fliegt eine OutOfMemoryException.

    Muss man das byte[] Array selbst wieder freigeben ?

    Nö. Dafür gibt's ja garbage collection. Nur bringst du den GC halt mächtig unter Druck wenn du alles über Funktionen einliest die immer neue Arrays erzeugen.

    Ich benutze deshalb die max.Puffergröße von 1 GB, bei meinem derzeitigen RAM von 32 GB könnte es auch etwas mehr sein.
    Auf meinem PC gibt es aber Dateien, die deutlich größer als 1 TB sind.

    Wenn du ein grosses Pagefile hast bzw. die "automatisch verwalten" Einstellung, dann wird das vermutlich erstmal richtig langsam werden, und dann wird irgendwann trotzdem eine OutOfMemoryException fliegen.

    Und wenn du kein/nur ein kleines Pagefile hast, dann wird es nicht so lange dauern bis die OutOfMemoryException geflogen kommt 🙂

    Eine Ausnahme sinngemäß "Datei für vorhandenen Speicher zu groß" habe ich nicht gefunden.

    Ja, OutOfMemoryException kann von so vielen Funktionen geworfen werden dass sie das nicht extra dokumentieren.



  • ps:
    @hkdd sagte in Wird bei DllImport die DLL-Datei pro Aufruf geladen ?:

                FileStream fs1 = new FileStream(Dsn1, FileMode.Open, FileAccess.Read);
                FileStream fs2 = new FileStream(Dsn2, FileMode.Open, FileAccess.Read);
    

    Ich würde empfehle das mit using zu machen, damit die Files auch garantiert immer wieder zugemacht werden. Ohne using kann es u.U. lange dauern bis die FileStream Objekte vom GC weggeräumt werden - und bis dahin bleibt das File-Handle dann offen.

    using (FileStream fs1 = new FileStream(Dsn1, FileMode.Open, FileAccess.Read))
    using (FileStream fs2 = new FileStream(Dsn2, FileMode.Open, FileAccess.Read))
    {
    
        // ...
    
    } // fs1 und fs2 werden hier automatisch geschlossen, egal wie der Block verlassen wird (normal, return, Exception)
    


  • @hustbaer sagte in Wird bei DllImport die DLL-Datei pro Aufruf geladen ?:

    Ich würde empfehle das mit using zu machen

    Ich mache doch am Ende in jedem Fall folgende Close-Aufrufe - ist das nicht identisch ?

                    fs1.Close();
                    fs2.Close();
    
    

    Bei der Anwendung meines Programmes ist es ja so, dass zwar viele Dateien und Bytes verglichen werden, es dabei i.d.R. aber weder Lesefehler noch Differenzen gibt. Dor Standard ist als alle Dateien sind OK und stimmen überein.
    Trotzdem lasse ich nach Sicherungen meiner wichtigen Dateien (meist auf externe HDDs) danach diesen Vergleich laufen. Damit habe ich eine Lesekontrolle und die Sicherheit, dass alles stimmt.



  • @hustbaer sagte in Wird bei DllImport die DLL-Datei pro Aufruf geladen ?:

    Dann fliegt eine OutOfMemoryException.

    Damit ist diese Funktion nur für relativ kleine Dateien nutzbar.



  • @hkdd sagte in Wird bei DllImport die DLL-Datei pro Aufruf geladen ?:

    @hustbaer sagte in Wird bei DllImport die DLL-Datei pro Aufruf geladen ?:

    Ich würde empfehle das mit using zu machen

    Ich mache doch am Ende in jedem Fall folgende Close-Aufrufe - ist das nicht identisch ?

                    fs1.Close();
                    fs2.Close();
    
    

    Bei der Anwendung meines Programmes ist es ja so, dass zwar viele Dateien und Bytes verglichen werden, es dabei i.d.R. aber weder Lesefehler noch Differenzen gibt. (...)

    Mir ist das im Prinzip Wurst wie du das machst 🙂 Ich wollte dich nur darauf hinweisen dass man das üblicherweise in .NET halt nicht so macht. Sondern eben using verwendet. Weil es eben nicht identisch ist. Deine Close Aufrufe werden halt nur erreicht wenn keine Exception fliegt. Die using Blöcke machen die Files dagegen auch in dem Fall zuverlässig zu.

    Damit ist diese Funktion nur für relativ kleine Dateien nutzbar.

    Ich würde ein paar GB schon als relativ gross bezeichnen. Ist halt relativ 😄


Anmelden zum Antworten