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 kommtEine 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. Ohneusing
kann es u.U. lange dauern bis dieFileStream
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. DeineClose
Aufrufe werden halt nur erreicht wenn keine Exception fliegt. Dieusing
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