2009-07-18 20 views
3

Ich verwende eine Bildbearbeitungsbibliothek, die eine Ausnahme auslöst, wenn ich versuche, Bilder> 4 GB groß zu laden. Es behauptet, 64-Bit zu sein, aber würde eine 64-Bit-Bibliothek nicht erlauben, Bilder größer als das zu laden? Ich denke, dass sie ihre C-Bibliotheken mit einem 64-Bit-Speichermodell/Compiler neu kompilierten, aber immer noch unsignierte Ganzzahlen und ein fehlgeschlagenes Upgrade verwendeten, um 64-Bit-Typen zu verwenden.64-Bit-Bibliothek auf 4 GB begrenzt?

Ist das eine vernünftige Schlussfolgerung?

Edit - Wie kann ein OS-Speicher so in Frage gestellt werden, dass die Zuweisung von großen Blöcken nicht mehr möglich ist? (Es funktioniert auch nicht nach einem Neustart, sondern nur wundernd.) Was ist mit .NET? Kann der .NET-verwaltete Speicher so fragmentiert werden, dass die Zuweisung großer Blöcke fehlschlägt?

+0

Es gibt viele 32bit enertia da draußen, wir haben es seit den 80er Jahren geschrieben, echte 64bit Unterstützung wird langsam auftreten, wenn Leute Teile von Betriebssystemen, Bibliotheken und Dateisystemen neu schreiben. – NoMoreZealots

+0

Nur neugierig: Welche Art von Bildern laden Sie, die über 4 GB sind? – jkeys

+2

Hooked: unkomprimierte hochauflösende Bitmaps können sehr groß sein. –

Antwort

4

Es ist ein vernünftiger Vorschlag, aber die genaue Ursache könnte eine Reihe von Dingen sein - zum Beispiel, welches OS laufen Sie, wie viel RAM/Swap haben Sie? Die Anwendung/das Betriebssystem kann den virtuellen Speicher nicht überladen, so dass Sie 4 GB (oder mehr) freien RAM benötigen, um das Image zu öffnen.

Aus Interesse scheint es ein definitiver Halt an der 4GB Grenze zu sein - dh ein 3.99GB Bild ist erfolgreich, aber ein 4GB ein Fehler - Sie sagen, dass es eine eindeutige Verwendung einer 32bit Größe in der vorschlagen würde Bibliotheken Datenstrukturen.

aktualisieren

Bezüglich Ihrer zweiten Frage - nicht wirklich. So gut wie alle modernen Betriebssysteme verwenden virtuellen Speicher, so dass jeder Prozess seinen eigenen zusammenhängenden Adressraum erhält. Ein einzelner zusammenhängender Bereich in einem Adressraum eines Prozesses muss nicht durch einen zusammenhängenden physikalischen RAM gesichert werden, er kann aus einer Anzahl von separaten physischen Bereichen des RAM bestehen, die so gemacht sind, dass sie aussehen, als wären sie zusammenhängend; Daher muss das Betriebssystem keinen einzigen 4 GB großen Speicherblock frei haben, um Ihrer Anwendung einen 4 GB großen Block zu geben.

Es ist möglich, dass eine Anwendung den virtuellen Adressraum so fragmentieren kann, dass kein zusammenhängender 4-GB-Bereich verfügbar ist. In Anbetracht der Größe eines 64-Bit-Adressraums ist dies in Ihrem Szenario jedoch höchst unwahrscheinlich.

+0

Ja, ein Bild knapp unter 4GB lädt tatsächlich. Ich benutze WinXP 64 mit 8 GB RAM. –

+0

@roygbiv: In diesem Fall denke ich, Sie sind auf dem Geld - während es eine 64-Bit-Bibliothek ist einige Datenstruktur auf 4 GB begrenzt. – DaveR

1

Ja, außer vielleicht das binäre Dateiformat selbst begrenzt die Größe von Bildern.

1

Um Ihre Follow-up zu beantworten, habe ich vor kurzem gelesen this Artikel und fand es interessant.

Und ja, .NET kann Probleme mit memory fragmentation haben.

+0

@colithium - Ausgezeichnete Lektüre! Vielen Dank. –

Verwandte Themen