ERLEDIGT
NEIN
NEIN
ANTWORTEN
11
11
ZUGRIFFE
438
438
EMPFEHLEN
-
Hallo zusammen,
ich habe ein Tool geschrieben, welches auf Basis der Exif-Daten Grafikdateien so umbenennt, das auch Bilder unterschiedlicher Kameras zeitlich richtig sortiert dargestellt werden.
Jeder der nach einem Urlaub die Bilder verschiedener Kameras händeln muss, wird das Problem kennen.
Um die Exif-Daten auszulesen, bin ich auf die Library "ImageStone" gestoßen.
In dieser wird beim Laden der Grafikdatei dynamisch Speicher mit "malloc" angefordert.
Bei einem Testlauf ist mir aufgefallen, das malloc nur funktioniert, wenn die Grafikdatei kleiner als 32MB ist. Sollte eigentlich reichen, aber bei Panoramas wird diese Grenze schon mal gerne gesprengt.
Kennt jemand dieses Phänomen?
Bisher bin ich noch auf keine Lösung gestoßen.
Kann mir vielleicht hier jemand helfen.
Danke schon einmal im Vorraus.
P.S.: Das Tool muss auf WinXp (x32) laufen.
-
15.10.09 16:34 #2
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Also 32 MiB sind lachhaft. Die Obergrenze bei einem 32bit Windows-System liegt bei 2GB Speicher der von einem Prozess verwendet werden kann. Ist der Speicher evtl. bereits erschöpft?
Wie sieht der Code aus?
GrußGeändert von deepthroat (15.10.09 um 18:07 Uhr)
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Hallo,
hab da wohl nicht genau genug geschrieben, was ich im Debugger sehe und die Zahlen am Ende auch nicht mehr mit Adlersaugen betrachtet.
Daher jetzt richtig:
Die Grafikdatei (jpg) ist 38MB groß.
Malloc soll 631321860Byte allocieren. Und das gleich zweimal. macht ca 1,3GB in Summe.
Die Library ist leider nicht von mir und mir reichts wenn die großen Panos nicht betrachtet werden.
Das Problem würde ich dennoch gern verstehn.
-
15.10.09 17:36 #4
- Registriert seit
- May 2008
- Ort
- Baunatal (Hessen)
- Beiträge
- 413
Ja schau dir dochmal deinen Arbeitsspeicher an, wie sollen 1.3 GB alloiziert werden, ewnn die nicht mehr zur verfügung stehen?.
Bei mir läuft Win XP mit allen Hintergrundprogrammen auf 500-800MB auslastung des Arbeitsspeicher.Bei der Geburt ist ein Mensch so unfertig, wie ein an einem schönen blauen Montag in Taiwan hergestellter Computer vor der Programmierung.
- Wolfgang Körner
-
15.10.09 18:21 #5
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Schonmal etwas von virtuellem Speicher gehört?
1.3 GB können durchaus von einem Prozess insgesamt alloziert werden, allerdings nicht unbedingt "am Stück".
Hier werden 1.4 GiB Speicher alloziert. Im Task Manager steht ein Wert von 1.469.948KB.Code c:
Um die EXIF Daten auszulesen mußt du aber auch nicht die ganze Datei dekodiert in den Speicher laden. Nimm eine andere Bibliothek oder probier's mal mit memory-mapped files.
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Hallo,
bin mir nicht sicher, ob ich das jetzt richtig rum schreibe, aber gibts da nicht einen Unterschied zwischen Stack und Heap? Wird der Speicher nicht anders verbaut, wenn bereits zum Compile Zeitpunkt bekannt ist, wieviel benötigt wird?
Ich werd den Ansatz aber mal nutzen und etwas testen. Vielleicht finde ich ja noch was.
Gruß
-
So nach einigen Tests liegen follgende Ergebnisse vor:
Im Construktor des MFC Dialoges kann ich ca 650800000 Byte 2x anlegen.
Mitten im Programm nur noch 2x 526100000 Byte.
Die benötigten 631321860 Byte sind also nicht mehr an gewünschter Stelle mögich.
Daher meine Frage:
Gibt es die Möglichkeit den freien Speicher zu ermitteln? Evt. durch eine try & catch Anwendung?
-
15.10.09 21:33 #8
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Mit malloc allozierter Speicher wird immer auf dem Heap angelegt. Automatische Variablen (z.B. statische Arrays) werden auf dem Stack angelegt.
Ja, das geht. Aber wozu soll das gut sein? Wenn nicht mehr soviel Speicher frei ist wie du brauchen würdest, dann nützt dir doch auch die Information nichts wieviel Speicher jetzt noch frei ist. Oder was willst du damit erreichen?
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Hallo,
die Info wäre insofern interessant um, die entsprechenden Library Funktionen zu vermeiden. Zur not reichen auch die "Erstellt am" Daten einer Datei. Das wäre zumindest die Quick & Dirty Version ohne die Library zu ändern
Nicht das das Tool täglich verwendet werden würde, aber abstürzen sollte es doch nicht.
Werd mal schauen was ich in der Lib noch machen kann... letztlich muss man ja davon ausgehen, das Speicher mal nicht angefordert werden kann.
Schönen Abend
-
16.10.09 08:07 #10
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Du hast noch nicht genau gesagt wo das Problem auftritt. In der ImageStone Bibliothek direkt?
Da es sich bei der Bibliothek um C++ handelt, wird doch hoffentlich statt malloc() der new bzw. new[] Operator verwendet, oder?
Dann wird eine std::bad_alloc Ausnahme geworfen die man fangen und behandeln kann. (wenn man einen ordentlichen C++ Compiler verwendet)
Auch bei malloc kann man prüfen ob Speicher alloziert werden konnte.
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Guten Morgen,
es wird tatsächlich "malloc" parallel zu Klassen verwendet.
Um folgende Funktion geht es:Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
inline BYTE* FCOXOHelper::ZeroMalloc (int nBytes) { #ifdef WIN32 int error=0; // BoundChecker can's check the memory alloc by <VirtualAlloc> #ifdef _DEBUG BYTE * pByte = (BYTE*)malloc (nBytes) ; memset (pByte, 0, nBytes) ; return pByte ; #else return (BYTE*)VirtualAlloc (NULL, nBytes, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE) ; #endif #else BYTE * pByte = (BYTE*)malloc (nBytes) ; memset (pByte, 0, nBytes) ; return pByte ; #endif }
Wie gesagt ich kann die Problematik außerhalb der Lib nachvolllziehn. Da in Sachen laden von Grafiken kein Handling von großen Grafiken vorgesehn ist, scheint auch eine entsprechende Bearbeitung nicht implementiert.
Gruß
-
16.10.09 13:31 #12
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Dann ändere doch einfach den Code der ZeroMalloc Funktion so, dass eine std::bad_alloc Ausnahme geworfen wird. Die kannst du ja dann fangen und behandeln.
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
Ähnliche Themen
-
Dynamisch auf nicht-dynamisch erstellte Controls zugreifen
Von Don Philippo im Forum .NET Windows FormsAntworten: 8Letzter Beitrag: 29.06.10, 19:45 -
Dynamisch erzeugte Textfelder werden auf dynamisch erzeugten MCs nicht angezeigt
Von JaguarGorgone im Forum Flash PlattformAntworten: 6Letzter Beitrag: 07.09.06, 17:48 -
Mein Internet geht nicht mehr. Keine Websiten mehr aufrufbar
Von convo im Forum Internet, DSL & FlatrateAntworten: 5Letzter Beitrag: 06.01.05, 10:26 -
Datenbankauswahl nicht mehr mehr möglich - phpMyAdmin
Von Bombi im Forum Relationale DatenbanksystemeAntworten: 2Letzter Beitrag: 27.01.04, 09:46 -
dynamisch html-elemente dynamisch ansprechen
Von TaJ im Forum Javascript & AjaxAntworten: 2Letzter Beitrag: 04.10.02, 16:33





Zitieren

Login






