Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

27.05.2014, 21:26

Optimale/maximale Speicherausnutzung C++ / floats

Hallo zusammen,

für ein Projekt bin ich etwas unsicher, was die Speichernutzung angeht. Vielleicht könnt Ihr mir weiterhelfen?

Also: Es sollen zur Laufzeit Objekte über XML eingelesen werden, die jeweils eine ganze Menge float-Variablen mitbringen. Bevor ich mich nun verrenne und nachher feststelle, dass mein Speicher das nicht packt (ist mit 1994 schon einmal passiert und hat ein ganzes Projekt zum kippen gebracht) meine Frage: Wie viele Daten darf ich in den Speicher legen - und ab wann muss ich anfangen, in Dateien/Datenbanken zu schreiben?

Vielen Dank für euer Input!

Herzliche Grüße
Corak

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

2

27.05.2014, 21:36

Zitat

Wie viele Daten darf ich in den Speicher legen - und ab wann muss ich anfangen, in Dateien/Datenbanken zu schreiben?

Du kannst so lange rein schreiben bis er voll ist ;) Dann fängst du (oder dein OS) an die Daten auszulagern.

Was genau hast du denn vor?
Wenn die floats schon in xml Dateien vor liegen (was übrigens recht langsam zu parsen ist), musst du wirklich alles im Speicher haben? Oder kannst du nach und nach laden?
Dann würde sich das Problem eigentlich nicht ergeben.

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

3

27.05.2014, 21:46

In so gut wie allen Fällen nie. Seit 1994 hat sich da sehr sehr viel getan.
Wieviele Float-Variablen in den Speicher passen, kannst du dir ja selbst ausrechnen.
Angenommen deinem Programm stehen 12GB von 16 zur Verfügung stehen: 12GB / sizeof(float) = 12GB / 4B = 3*10⁹
Unter der Bedinung würden also gut 3 Milliarden Stück. Theoretisch.
Tatsächlich, auf einem 64Bit Betriebssystem wenn mehr Speicher angefordert wird, als RAM zur Verfügung steht, lagert das Betriebssystem selbständig Daten auf die Festplatte aus. Auf einem 32 Bit Betriebsystem kann eher der virtuelle Adressraum der limitierende Faktor sein, der verhindert, das deine Anwendung mehr als 2- 3GB(Je nach Betriebssystem) direkt zugreifen kann. Und da hilft auch Auslagern seitens des OS nichts, schließlich mangelt es an Adressierungsmöglichkeiten innerhalb einer Anwendung, nicht am physischen Speicher. Insbesondere auf 64Bit Betriebssystemen können auch Memory Mapped Files interessant sein.

XML Daten werden, dadurch das sie textbasiert arbeiten oder auch als DOM Repräsentation, selbst aber wesentlich um ein Vielfaches größer ausfallen, als die enthaltenen ausgelesenen Roh-Fließkommadaten. Ich frage mich, worauf du hinaus willst.

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

4

27.05.2014, 22:08

Was dann auch bedeutet, wenn der Speicher wirklich ein Problem darstellen könnte, ist XML in diesem Fall als Format wirklich nicht angebracht.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

27.05.2014, 22:47

Noch mal mit anderen Worten: Damit die Werte nicht in den RAM passen, muss das XML schon viele viele Gigabyte groß sein und dann wäre XML ohnehin das falsche Format.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

6

27.05.2014, 22:47

Speicher Ein- und Auslesen

Hmm, ich habe da wohl etwas angestoßen. Da frage ich mich, wie viele ich in den Speicher laden kann und überlege mir erst im Nachhinein, wie ich ich diese Daten am besten Einlesen oder Speichern kann. Naja, ist wohl durch die Erfahrung von vor 20 Jahren bedingt...

Also faktisch habe ich mehrere mio. ( Größenordnung 5*10^8 ) floats zu verwalten. Das sind beim der derzeitigen XML-Struktur ca. 5*10^9 bis 10^10 Zeichen Dateilänge.

Was gibt es denn da an alternativen modernen, schnellen und effizienten Einlese-Verfahren für C++?

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

7

27.05.2014, 22:56

Die floats binär aneinander reihen wäre das schnellste und dafür platzsparendste.
Wenn das lesen eher unwichtig ist könnte man sicher noch komprimieren.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

27.05.2014, 23:01

5*10^8 sind etwa 2GB an reinen Float-Daten bei bis zu 9GB XML File Größe. Das ist schon wirklich allerhand. Woher stammt diese beeindruckende Menge Daten?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlueCobold« (27.05.2014, 23:06)


Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

9

27.05.2014, 23:09

Zitat

Was gibt es denn da an alternativen modernen, schnellen und effizienten Einlese-Verfahren für C++?

Nicht XML? Einfache binär am Besten.
Das sprengt jedenfalls eindeutig weit den meiner Meinung nach sinnvollen Rahmen eines solchen Formates.
Wegen effizienten "Einleseverfahren" kann ich vielleicht nochmal auf die Memory Mapped Files verweisen. ;)

Am Besten schreibst du mal, was du eigentlich genau machen willst und um welche Daten es sich handelt.
Vielleicht gäbe es auch die Möglichkeit einfach ein kleineres Datenformat zu wählen.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Spiele Programmierer« (27.05.2014, 23:15)


Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

10

27.05.2014, 23:54

Naja, mit nem SAX-Parser kann man davon schon so schnell lesen, wie die Festplatte die Daten hergibt. Ein DOM-Parser wär natürlich doof :-)

Aber vom Lesen abgesehen sind 2 Milliarden floats kein Problem. Das sind 8 GB Speicher. Mach ne 64Bit-Exe draus und lad das Zeug, wie's kommt.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Werbeanzeige