Forum: PC-Programmierung Daten über 2GB verarbeiten Win32 Windows7


von F. L. (Gast)


Lesenswert?

Hallo zusammen,

ich habe in einem WIN32 C++ - Programm ein Array, dass ich zum Start der 
Anwendung allokiere. Dieses Array ist aufgrund gestiegener Anforderungen 
mittlerweile recht groß und soll noch größer werden.

Ist es vllt möglich, dass ich manuell in Pages auslager und die 
Informationen des Arrays in die Pages schreibe und im virtuellen 
Speicher ein Array von Pointern anlege die auf die Pages zeigen und ein 
weiteren virtuellen Speicher alokiere um die Informationen der Pages zu 
verarbeiten.

Das "largeaddressspaceawarenessflag" möchte ich nur ungerne benutzen, da 
dieses das Problem nur kurzfristig lösen würde.

Vielen Dank für die Antworten.

von (prx) A. K. (prx)


Lesenswert?

Weshalb ausgerechnet Win32?

von F. L. (Gast)


Lesenswert?

Ich möchte, dass es weiterhin auf älteren Rechner läuft und möchte diese 
und meine Anwendung ungerne umstellen.

von (prx) A. K. (prx)


Lesenswert?


von Horst (Gast)


Lesenswert?

Felix T. schrieb:
> Dieses Array ist aufgrund gestiegener Anforderungen
> mittlerweile recht groß und soll noch größer werden.

Hört sich irgendwie nach beschissener Programmierung an. Was packst du 
da alles rein???

von F. L. (Gast)


Lesenswert?

@ A. K. (prx)

Hast du Erfahrungen damit unter Win32?

Weil die Funktion: MapUserPhysicalPages() hat ja folgenden Zusatz:

64-bit Windows on Itanium-based systems:  Due to the difference in page 
sizes, MapUserPhysicalPages is not supported for 32-bit applications.

von Bastler (Gast)


Lesenswert?

Deswegen gibt es 64Bit Maschinen. Nicht primär wegen großen Zahlen, 
sondern wegen großem Adressraum. Einfach die Virtualisierung von 
Speicher dem OS überlassen, denn das haben in der Regel Leute gebaut, 
die davon was verstehen. Da kommt der Durchschnittsprogrsmmiermichel 
nicht mit. Und dann Speichermäsig aus dem Vollen schöpfen. Nur wenn ich 
nur 31(31,5) Bit virtuelle Adressen hab, dann muß ALLES in 2(/3) GB 
passen. Also entweder 64Bit OS, oder alles selber machen.

von F. L. (Gast)


Lesenswert?

@Bastler

Und selber machen würdest du dann auch wie im AWE-Beispiel?

von (prx) A. K. (prx)


Lesenswert?

F. L. schrieb:
> Hast du Erfahrungen damit unter Win32?

Nein, weiss nur dass es das gibt, oder gab. Kam mir seit jeher ähnlich 
elegant vor wie EMS unter DOS. Und ist im Zeitalter von 64-Bit Systemen 
genauso schräg wie deine circa 20 Jahre zu spät kommende Frage.

> 64-bit Windows on Itanium-based systems:

Diese deine Sorge setzt der Sache die Krone auf. Sich für den Fall eines 
IA64 Systems Sorgen drum machen, ob dessen Win32 Emulation mit AWE klar 
kommt. ;-)

: Bearbeitet durch User
von Noch einer (Gast)


Lesenswert?

Win16 hatte damals Handle Pointer. Die Library müsste sich doch noch 
finden lassen.

von (prx) A. K. (prx)


Lesenswert?

Es sollte in C++ übrigens eine relativ simple Fingerübung sein, 
virtuelle Arrays beliebiger Grösse zu implementieren.

von F. L. (Gast)


Lesenswert?

A. K. schrieb:
> Es sollte in C++ übrigens eine relativ simple Fingerübung sein,
> virtuelle Arrays beliebiger Grösse zu implementieren.

Wie meinst du das?

von (prx) A. K. (prx)


Lesenswert?

F. L. schrieb:
> Wie meinst du das?

Du kennst C++ schon? Oder kommt das noch?

von Bastler (Gast)


Lesenswert?

> Und selber machen würdest du dann auch wie im AWE-Beispiel?

Neben der Tatsache, daß das nur bei Server-Versionen von Windows 
wirklich unterstützt wird, würde ich mir lieber ein 64Bit OS (gibt's 
sogar für umme) besorgen, als EMS die n-te anzutun.

von Markus G. (Gast)


Lesenswert?

Auslagern auf die Platte, z.B. mit dieser Wrapper-Klasse:

http://www.codeproject.com/Articles/364/CFile-File-System-Wrapper

von Bastler (Gast)


Lesenswert?

> 64-bit Windows on Itanium-based systems:  Due to the difference in page sizes, 
MapUserPhysicalPages is not supported for 32-bit applications.

> Ich möchte, dass es weiterhin auf älteren Rechner läuft und möchte diese und 
meine Anwendung ungerne umstellen.


@F.L.: alte PC's enthalten sehr selten Itanium. Und das Mappen 
physikalischer Seite setzt diese in Hardware voraus. Beides hat mit 
deinem Problem nur in soweit zu tun, daß die Tatsache, daß du danach 
fragst, die Wahrscheinlichkeit daß du dein Problem gelöst bekommst 
senkt.
Kannst du nicht ein bischen mehr erzählen mit was du die 2GByte füllst?

von Sebastian Hepp (Gast)


Lesenswert?

Wenn du wirklich mehr als 2GByte Daten nutzen willst, dann kommst du 
nicht darum herum, die Daten in eine Datei zu schreiben und immer nur 
den aktuell benötigten Teil im RAM zu halten. Der Nutzer darf aber kein 
FAT12/16/32 Dateisystem mehr haben, denn dort können die Dateien auch 
nur maximal 4GByte groß sein. Und selbst mit NTFS ist das Einlesen einer 
so großen Datei sicher nicht trivial.

Wenn die Datenmenge langfristig also immer weiter ansteigt, dann kommst 
du um 64 Bit nicht herum.

von Peter II (Gast)


Lesenswert?

Sebastian Hepp schrieb:
> Und selbst mit NTFS ist das Einlesen einer
> so großen Datei sicher nicht trivial

warum soll das schwerer als bei 2kbyte sein?

man braucht nur die seek64 Funktion zu verwenden, read und write muss 
nicht angepasst werden.

von (prx) A. K. (prx)


Lesenswert?

Sebastian Hepp schrieb:
> Der Nutzer darf aber kein FAT12/16/32 Dateisystem mehr haben

Wenn man den Speicher zerhackt, dann kann man das auch mit den Files 
machen.

> Wenn die Datenmenge langfristig also immer weiter ansteigt, dann kommst
> du um 64 Bit nicht herum.

Wird bloss immer umständlicher und ineffizienter.

von Vlad T. (vlad_tepesch)


Lesenswert?

Bei Daten dieser Größe könnte man sich überlegen, ob man nicht eine 
Datenbank benutzt, die sich um die Speicherung kümmert. Das muss nicht 
unbedingt eine client-server Architektur sein, sondern kann auch was 
integriertes, wie sqlite oder so sein. Je nach Anwendungsfall KANN 
dies eine äußerst sinnvolle Lösung sein.
Die Frage ist halt, was du mit den Daten machst.

von fb (Gast)


Lesenswert?

Ansonsten gibt es ja auch noch CreateFileMapping, MapViewOfFile und 
Artverwandtes.

von Klaus (Gast)


Lesenswert?

F. L. schrieb:
> Ist es vllt möglich, dass ich manuell in Pages auslager und die
> Informationen des Arrays in die Pages schreibe und im virtuellen
> Speicher ein Array von Pointern anlege die auf die Pages zeigen und ein
> weiteren virtuellen Speicher alokiere um die Informationen der Pages zu
> verarbeiten.

Genau so musst Du es machen.

Die Rohdaten liegen in einer Virtuellen Datei. Da gehst Du mit einem 
Parser drüber, der Dir die eigentlichen Datenblöcke raussucht.

Für jeden Datenblock legst Du einen Zeiger an. Den schreibst Du in eine 
andere virtuelle Datei. Dann kannst Du nämlich bequem von verschiedenen 
Threads (oder auch Prozessen) drauf zugreifen.

Die eigentliche Analyse der Daten und auch die Ausgabe machst Du in 
deinem Hauptprogramm. Aber nur das Auswerten, was Du auch wirklich 
brauchst. 30.000 Datensätze in einem Listview kommt nämlich garnicht gut 
an.

Bastler schrieb:
> Neben der Tatsache, daß das nur bei Server-Versionen von Windows
> wirklich unterstützt wird, würde ich mir lieber ein 64Bit OS (gibt's
> sogar für umme) besorgen, als EMS die n-te anzutun.

Und das würde ich schonmal garnicht machen. Es sei denn, Du brauchst 
mehr als 2 GByte Speicher am Stück, und selbst dann nicht.
Wenn Du nämlich in C++ für 32 programmierst, dann läuft das auf 32 Bit 
und 64 Bit und Du hast alles abgehakt. Bei 64 Bit ist das nicht so.

Sebastian Hepp schrieb:
> Wenn die Datenmenge langfristig also immer weiter ansteigt, dann kommst
> du um 64 Bit nicht herum.

Das seh ich anders. Was hindert mich, einfach eine weitere Virtuelle 
Datei mit 2 GBytes anzulegen?

fb schrieb:
> Ansonsten gibt es ja auch noch CreateFileMapping, MapViewOfFile und
> Artverwandtes.

Genau so ist es! Virtuelle Datei. Sag ich doch.

Gruß Klaus

von Georg (Gast)


Lesenswert?

fb schrieb:
> Ansonsten gibt es ja auch noch CreateFileMapping

Memory Mapped Files gibt es unter verschiedenen Betriebssystemen und 
Sprachen. Es ist halt blöd, wenn man über 2 GB auf Disk auslagern muss, 
während der Rechner womöglich 16 GB RAM hat - da könnte man auf die Idee 
kommen, sowas altmodisches wie eine RAM-Disk einzurichten, aber das ist 
dann um so viele Ecken konstruiert, dass das ins Horrorkabinett 
überdrehter Programmierer gehört. Ein 64-Bit-System ist viel einfacher.

Georg

von c-hater (Gast)


Lesenswert?

F. L. schrieb:

> ich habe in einem WIN32 C++ - Programm ein Array, dass ich zum Start der
> Anwendung allokiere. Dieses Array ist aufgrund gestiegener Anforderungen
> mittlerweile recht groß und soll noch größer werden.
>
> Ist es vllt möglich, dass ich manuell in Pages auslager und die
> Informationen des Arrays in die Pages schreibe und im virtuellen
> Speicher ein Array von Pointern anlege die auf die Pages zeigen und ein
> weiteren virtuellen Speicher alokiere um die Informationen der Pages zu
> verarbeiten.

Ja. Lies' die Doku zu den API-Funktionen "CreateFileMapping" und 
"MapViewOfFile". Das macht genau, was du brauchst und benutzt dazu genau 
die Mechanismen, die das ganze System sowieso ständig für den Zugriff 
auf virtuellen Speicher benutzt. D.h.: du kannst davon ausgehen, daß die 
Scheiße prinzipiell funktioniert und dich bei der Fehlersuche voll auf 
deinen eigenen Code konzentrieren...

von fb (Gast)


Lesenswert?

Wobei die Bemerkung von Vlad nicht unbeachtet bleiben sollte! Je nach 
Art der Daten kann eine Datenbank tatsächlcih die bessere Alternative 
sein.

von Bastler (Gast)


Lesenswert?

> Kannst du nicht ein bischen mehr erzählen mit was du die 2GByte füllst?

Wenn es eben ganz geheim wär, um was es sich bei den Daten handelt, dann 
könnte man vielleicht entdecken, daß das eigentliche Problem schon 
existiert, bevor es 2 GB groß abgelegt wird.

von Der Andere (Gast)


Lesenswert?

Die einzig sinnvolle Frage an den TO ist hier:

Vlad T. schrieb:
> Die Frage ist halt, was du mit den Daten machst.

bevor man nicht weiss was er da verarbeiten will, ist es müßig nach 
einer passenden Lösung zu suchen.
Wenn er ein Array von 10000 * 10000 Structs oder Objekten anlegt, obwohl 
99% der Plätze nie belegt werden, dann sieht eine sinnvolle Lösung ganz 
anders aus, als wenn er eine 4 GByte große XML oder TextDatei bearbeiten 
und suchen/wahlfrei schreiben muss.

Ist wieder das alte Problem:
Nicht die angebliche Lösung, sondern das eigentliche Problem 
beschreiben. Siehe dazu die Netiquette unter Problembeschreibung

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.