AGB  ·  Datenschutz  ·  Impressum  







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

Problem mit Memory Mapped Files

Ein Thema von bono_82 · begonnen am 18. Apr 2007 · letzter Beitrag vom 22. Apr 2007
Antwort Antwort
Seite 1 von 2  1 2      
bono_82

Registriert seit: 11. Dez 2005
17 Beiträge
 
#1

Problem mit Memory Mapped Files

  Alt 18. Apr 2007, 07:43
Hallo,

ich muss für meine Anwendung mit sehr großen Dateien arbeiten (bis 4GB). Aus diesem Grund lade ich eine große
Datei als Memory Mapped File. Ich hab gelesen, dass das theoretisch bis 4 GB geht, aber man nur 2 GB nutzen kann, da das BS
sich die anderen 2GB reserviert. Mein Problem ist allerdings, dass ich auch schon ab einer 1 GB großen Datei Fehlermeldungen bekomme. Mit kleineren Files (ca. 100 MB) Dateien funktioniert aber prinzipiell alles prima. Hier mal der Code zum Öffnen einer Datei als MMF.
Hat jemand einen Ratschlag?

Delphi-Quellcode:
str:=VisuFilePath+VisuFileName+'.dat';

{Variante mit Memory Mapped Files}
FileHandle := GetHandle(str); //Fkt. um Handle zu erzeugen
if FileHandle = INVALID_HANDLE_VALUE then
   Raise exception.Create('File could not be opened!');
FileSize := GetFileSize(FileHandle,nil);

MapHandle := CreateFileMapping(FileHandle,nil,PAGE_READONLY,0,0,nil);
if MapHandle = 0 then begin
   CloseHandle(FileHandle);
  Raise Exception.Create('Filemapping Error!');
end;

FData := MapViewOfFile(MapHandle,FILE_MAP_READ,0,0,0);

if FData = nil then begin
   CloseHandle(MapHandle);
  Raise Exception.Create('Filemapping Error!');
end;
FData ist der Pointer auf den Beginn des Speicherbereich in dem meine Daten liegen.
Bei meiner 1 GB großen Datei wird für FData allerdings nil zurückgeliefert. Probleme sollten doch aber erst ab ca. 2GB auftreten?

Gruß,
bono
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Problem mit Memory Mapped Files

  Alt 18. Apr 2007, 07:57
1, Deine gesamte Anwendung kann unter Win32 maximal 2 GB an speicher haben. Unter Win64 mit richtigen Memory Manager und Windows-Einstellung 3 GB

2, Ich vermute mal das die Memory Mapped Files u.U. einen zusammenhängenden Adressbereich in der Anwendung benötigen. Und wenn man so sieht wieviel DLLs gewollt oder ungewollt in einer Exe "gemappt" sind und wo ist selbst 1 GB schon ein sehr guter Wert.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
bono_82

Registriert seit: 11. Dez 2005
17 Beiträge
 
#3

Re: Problem mit Memory Mapped Files

  Alt 18. Apr 2007, 10:04
Danke für Deinen Tipp. Deiner Aussage nach müsste meine Anwendung dann auch schon ohne die verwendete Datei 1GB an
Adressraum "verbraten". Kann ich mir irgendwie nicht vorstellen. Ich kenn mich da allerdings auch nicht so aus.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Problem mit Memory Mapped Files

  Alt 18. Apr 2007, 10:05
Zitat von bono_82:
Danke für Deinen Tipp. Deiner Aussage nach müsste meine Anwendung dann auch schon ohne die verwendete Datei 1GB an
Adressraum "verbraten". Kann ich mir irgendwie nicht vorstellen. Ich kenn mich da allerdings auch nicht so aus.
Nein.
Jedoch die geladenen DLL's liegen verstreut im Adressraum so daß es keinen zusammenhängenden 1GB-Bereich mehr gibt der vermutlich dafür benötigt wird.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Problem mit Memory Mapped Files

  Alt 18. Apr 2007, 10:29
Und warum nimmst du nicht ein TFileStream? MMFs sind ja nicht für große Dateien gedacht sondern für IPC, IMHO.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Problem mit Memory Mapped Files

  Alt 18. Apr 2007, 10:48
Wenn Du nur mit moderneren Windowsversionen arbeitest, bedient Windows Filezugriffe eh bevorzugt durch Mapping in den Filecache, memory mapped files bringen da nicht mehr die riesigen Leistungszuwächse. Dazu kommt noch dass der Gesamtspeicher des Systems ja auch eher begrenzt ist und du durch gnadenlosen Speicherhunger an anderer Stelle Performance in grossem Massstab verbrennst (erzwungenes Swapping anderer Prozesse und massive Swapfilezugriffe -> Bremse). Mit MapViewOfFile kannst Du aber z.B. auch die Größe des gemappten Bereichs angeben, so dass sich da z.B. ein Fenster von sagen wir 256 MB (je nachdem wieviel Du im File herumspringst und wieviel Speicher vorhanden ist) anbieten würde. Zugriffe aufs File bzw. dessen View musst Du dann nur durch eine Filterfunktion laufen lassen, die ggf. den View ändert wenn die angeforderte Adresse ausserhalb des momentan gemappten Bereichs liegt.
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat
bono_82

Registriert seit: 11. Dez 2005
17 Beiträge
 
#7

Re: Problem mit Memory Mapped Files

  Alt 18. Apr 2007, 12:34
Das klingt interessant. Würde ein solches "Fenster" auch für Bereiche zw. z.B. 3 und 4 GB funktionieren oder
trifft einen da irgendwie die oben erwähnte 2 GB Grenze?

@sirius:
MMF's kann man meiner Ansicht nach auch für den Umgang mit sehr großen Dateien verwenden, da die bearbeitete Datei auf der Festplatte bleibt und ich mir nur bestimmte Abschnitte in den Speicher holen möchte.
Ich hab mir auch eine TFileStream-Variante erstellt, allerdings muss ich da immer mit irgendwelchen Puffern arbeiten, die bei mir schnell sehr groß werden können. Bei MMF's arbeite ich mit Pointern.

Danke für eure Hinweise. Bin für weitere Tips aufgeschlossen!
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#8

Re: Problem mit Memory Mapped Files

  Alt 18. Apr 2007, 12:47
Es koennte helfen die Dokumentation der Funktionen zu lesen. Der Aufruf von MapViewOfFile(MapHandle,FILE_MAP_READ,0,0,0); bedeutet das das gesamte File in den Speicher gemappt werden soll. Es macht mehr Sinn ein kleineres Fenster zu waehlen. Dann wird auch nur Speicher fuer dieses Fenster belegt und nur ein Teil des Files gemappt. Will man auf einen anderen Teil des Files zugreifen muss man das Mapping aendern.
Idealerweise bindet man das in einer Klasse ein (ich wette da gibt es schon welche im Internet).
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: Problem mit Memory Mapped Files

  Alt 18. Apr 2007, 12:48
Was willst Du denn mit diesen riesigen Dateien anstellen? Wenn in diesen Dateien irgendwelche Daten sind, dann pack sie in eine ordendliche DB.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
DMW

Registriert seit: 6. Sep 2006
Ort: Münster
269 Beiträge
 
Delphi XE Professional
 
#10

Re: Problem mit Memory Mapped Files

  Alt 19. Apr 2007, 13:54
Zitat von Bernhard Geyer:
1, Deine gesamte Anwendung kann unter Win32 maximal 2 GB an speicher haben. Unter Win64 mit richtigen Memory Manager und Windows-Einstellung 3 GB
Nein, auch unter Win32 ist es möglich, einem Programm 3 GB Speicher zuzuteilen, indem man Windows mit der Kerneloption /3GB startet und entsprechende Linkereinstellungen tätigt. Unter Win64 ist der Speicher bei den gegenwärtigen Versionen AFAIK auf 8192 GB begrenzt.
Moritz
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 17: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