Frage

Ich verwende eine Bildbearbeitungsbibliothek, die eine Ausnahme auslöst, wenn ich versuche, Bilder mit einer Größe von mehr als 4 GB zu laden.Es soll 64-Bit sein, aber würde eine 64-Bit-Bibliothek nicht das Laden größerer Bilder ermöglichen?Ich glaube, sie haben ihre C-Bibliotheken mit einem 64-Bit-Speichermodell/-Compiler neu kompiliert, aber immer noch vorzeichenlose Ganzzahlen verwendet und das Upgrade auf die Verwendung von 64-Bit-Typen ist fehlgeschlagen.

Ist das eine vernünftige Schlussfolgerung?

Bearbeiten - Kann der Betriebssystemspeicher im Nachhinein so fragmentiert werden, dass die Zuweisung großer Blöcke nicht mehr möglich ist?(Es funktioniert auch nicht direkt nach einem Neustart, aber ich frage mich nur.) Was ist mit unter .NET?Kann der von .NET verwaltete Speicher so fragmentiert werden, dass die Zuweisung großer Blöcke fehlschlägt?

War es hilfreich?

Lösung

Das ist ein vernünftiger Vorschlag, die genaue Ursache könnte jedoch verschiedene Ursachen haben – zum Beispiel welches Betriebssystem Sie verwenden, wie viel RAM/Swap haben Sie?Die Anwendung/das Betriebssystem darf den virtuellen Speicher nicht überbeanspruchen, daher benötigen Sie 4 GB (oder mehr) freien RAM, um das Image zu öffnen.

Aus Interesse scheint es ein definitiver Stopp an der 4-GB-Grenze zu sein – d. h.Ist ein 3,99-GB-Image erfolgreich, aber ein 4-GB-Image schlägt fehl? Sie sagen, dass dies der Fall ist, was auf eine eindeutige Verwendung einer 32-Bit-Größe in den Datenstrukturen der Bibliotheken schließen lässt.

Aktualisieren

Was Ihre zweite Frage betrifft – nicht wirklich.Nahezu alle modernen Betriebssysteme verwenden virtuellen Speicher, sodass jeder Prozess seinen eigenen zusammenhängenden Adressraum erhält.Ein einzelner zusammenhängender Bereich im Adressraum eines Prozesses muss nicht durch zusammenhängenden physischen RAM gestützt werden. Er kann aus mehreren separaten physischen RAM-Bereichen bestehen, die so aussehen, als wären sie zusammenhängend.Daher muss das Betriebssystem keinen einzigen 4-GB-Block RAM frei haben, um Ihrer Anwendung einen 4-GB-Block zur Verfügung zu stellen.

Es ist möglich, dass eine Anwendung ihren virtuellen Adressraum so fragmentiert, dass kein Platz für einen zusammenhängenden 4-GB-Bereich vorhanden ist. Angesichts der Größe eines 64-Bit-Adressraums ist dies in Ihrem Szenario jedoch höchst unwahrscheinlich.

Andere Tipps

Ja, es sei denn, das Binärdateiformat selbst begrenzt die Größe der Bilder.

Um Ihr Follow -up zu beantworten, habe ich kürzlich gelesen Dies Artikel und fand es interessant.

Und ja, .NET kann Probleme mit haben Gedächtnisfragmentierung.

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