AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Memory Mapped Files bei vielen (großen) Bitmaps

Ein Thema von Schwedenbitter · begonnen am 8. Feb 2016 · letzter Beitrag vom 8. Feb 2016
Antwort Antwort
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#1

Memory Mapped Files bei vielen (großen) Bitmaps

  Alt 8. Feb 2016, 12:20
Hallo,

ich bin dabei, ein Programm für eine Dokumentenverwaltung zu schreiben. Über einen Seitenscanner werden große Datenmengen geliefert. Diese wollte ich irgendwo auslagern, um den RAM zu schonen. Bei 300 dpi in DINA-A4 sind das 16 MB pro Seite. Zusätzlich soll der Benutzer die Möglichkeit haben, Kontrast und Kompressionsstärke bei jpg anzupassen.
Aktuell "löse" ich das über ein simples TBimap.SaveToFile(); . Bei/vor dem Verarbeiten lade ich dann das betreffende Bitmap zurück. Dabei zeigt sich die HDD - wer hätte das auch anders gedacht - als Flaschenhals.

Dadurch kamen MMF ins Spiel. Diese bleiben auch im RAM und werden erst (in der Auslagerungsdatei?) ausgelagert, wenn dieser voll ist - sofern ich das System richtig verstanden habe.
Allerdings kam mir dabei die Überlegung, dass Windows doch sowieso in die Auslagerungsdatei schreibt, wenn der RAM aufgebraucht ist. So richtig sehe ich also keinen Vorteil. Es kommt hinzu, dass MMF programmtechnisch aufwendig sind, insbesondere weil die Größe beim Schreiben/Lesen feststehen muss und diese von Bitmap zu Bitmap unterschiedlich ist.

Ich bin jetzt also am Grübeln, ob ich mir das antue und wüsste gern Eure fachkundige Meinung dazu.

Wie es funktioniert, habe ich mir erarbeitet und auch ein klitzekleine Funktionieren Class von TBitmap abgeleitet. Bevor ich aber weiter mache, stelle ich lieber mal diese Frage.
Falls ich hier falsch bin und die Frage eher zu "Win32/Win64 API (native code)" gehört, kann das bitte mal der Moderator erledigen. Danke.
Alex Winzer
  Mit Zitat antworten Zitat
matashen

Registriert seit: 29. Jan 2007
Ort: daheim
460 Beiträge
 
Delphi XE2 Enterprise
 
#2

AW: Memory Mapped Files bei vielen (großen) Bitmaps

  Alt 8. Feb 2016, 12:31
Also ich würde da noch überlegen die Daten als PNG zwischen zu speichern oder als Endformat zu nehmen. PNG ist in Delphi integriert, hat gute Kompression und Komprimiert verlustfrei. Dadurch speicherst du wesentlich schneller als Bitmap. musst nur TPNGImage in die uses Klausel schreiben, dann geht das Format mit den TGraphic Schnittstellen.

Gruß Matthias
Matthias
Das Leben ist eines der härtesten.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#3

AW: Memory Mapped Files bei vielen (großen) Bitmaps

  Alt 8. Feb 2016, 12:32
SaveToFile speichert zuerst in den WindowsFileCache und Windows schiebt es auf die Festplatte. Es bleibt dann auch im Cache, so lange wie möglich.
Wenn der RAM reicht, wird die Festplatte kein Flaschenhals sein.

MMF mit Dateianbindung, mappt es in den "physischen" RAM, wenn der Platz reicht und der REST bleibt auf der Festplatte. (in der Datei)
Bei MMF ohne Datei bleibt es im physischen RAM oder landet in der Auslagerungsdatei (Festplatte).

Speicherseiten im Virtuellen Arbeitsspeicher bleiben immer da, wo man sie hingemappt hat, aber aber ob sie "aktuell" im physischen Speicher geladen sind, hängt davon ab, ob man darauf zugreift und ob genügend physischer Speicher zur Verfügung steht.

Fazit: Du kannst nur durch MMF rein garnichts verbessern.
Außer zusätzlich zum physischen RAM auch noch deinen Virtuellen vollzumüllen (PS: Bei einem 32-Bit-Programm hast du da nur maximal 2 bis 3 GB RAM zur Verfügung)

Und dein Flaschenhals ist eigentlich der zu geringe Arbeitsspeicher.



PS: PNG hat zwar eine "gepackte" Version des Bildes, aber es existiert auch intern eine entpackte Version (Bitmap), vorallem wenn man das PNG fisch erstellt hat (neu generiert und bemalt) oder darin rummalt.
TPngImage.GetHeader{TChunkIHDR}.FreeImageData
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 8. Feb 2016 um 12:40 Uhr)
  Mit Zitat antworten Zitat
matashen

Registriert seit: 29. Jan 2007
Ort: daheim
460 Beiträge
 
Delphi XE2 Enterprise
 
#4

AW: Memory Mapped Files bei vielen (großen) Bitmaps

  Alt 8. Feb 2016, 12:51
Hi Himutsu,

das mit PNG im RAM ist korrekt,

nur beim schreiben von/zu der Festplatte ist ein wesentlicher Unterschied, es erreicht auch ohne verluste nahezu die Packungsdichte von JPG, vor allem bei gescannten Seiten wo viel Identische Farben sind. Bei Fotos ist die Packungsdichte nicht ganz so gut wie im JPG, dafür aber immer noch verlustfrei - und in Bezug auf Festplattenplatz/Schreibmenge/Lesemenge immer noch besser als Bitmaps auf die Platte zu schieben.
Matthias
Das Leben ist eines der härtesten.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#5

AW: Memory Mapped Files bei vielen (großen) Bitmaps

  Alt 8. Feb 2016, 13:28
Hast Du mal überlegt, ob Du den Farbraum reduzieren kannst?
Sollte bei Dokumentenscans unproblematisch sein oder?
Greyscale 256 reduziert bei BMP den Speicherbedarf enorm, ebenso bei PNG.
JPG ist m.E. unschlagbar, zumindest bei "natürlichen" Bildern wie einem scheinbar weißen Blatt Papier, das wahrscheinlich mehr Weißabstufungen hat als die Eskimos Schneesorten kennen. Bei Screenshots bspw. sind es meist viel weniger Farben, da eignet sich m.E. PNG besser wegen der geringen Kompressionsartefakte bei starkem Kontrast.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#6

AW: Memory Mapped Files bei vielen (großen) Bitmaps

  Alt 8. Feb 2016, 13:44
Meine Aussage bezog sich vorallem auf viele PNG im RAM, anstatt der Bitmap.
Zur Laufzeit brauchen gepackte Formate (PNG, JPEG usw.) oft mehr Platz, als ein Bitmap, vorallem wenn sie als Zwischenspeicher ein Bitmap benutzen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Memory Mapped Files bei vielen (großen) Bitmaps

  Alt 8. Feb 2016, 17:01
Braucht der Anwender wirklich 300DPI für eine Dateivorschau des Dokuments?
Speichere eine verkleinerte Version als JPG, die standardmäßig zur Voransicht geladen wird.
Erst wenn der Anwender zur Lupe greift, würde ich die volle Auflösung laden.
Oder in einem Thread im Hintergrund, wenn fertig wird umgeschalten.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz