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

18.04.2009, 10:42

ifstream::seekg() zu langsam

Hi Spieleprogger! In meinem Programm lade ich etwa alle 10 Sekunden eine Daten aus einer Text Datei. Dabei bin ich gezwungen alle 10 sekunden insgesammt ca. 20.000 mal idstream::seekg() aus zu führen. Dies dauert dann in etwa 0,25 Sekunden. Wenn ich aber einfach nur ifstream::get() benutze, ohne selbst den zeiger zu setzen, dann ist die dauer kaum messbar, so gering ist die. Leider bin ich gezwungen seekg zu benutzen, da die Daten die ich Laden möchte, an ganz unterschiedlichen stellen in der Datei liegen.

Nun frage ich mich ob es noch eine andere möglichkeit gibt, einen char an einer bestimmten stelle zu laden, die auch möglichst schnell ist! Die Textdatei enthält mehrere Milliarden von Buchstaben, aus diesem Grund kann ich die ganze Datei vorher in einen string laden!

Anonymous

unregistriert

2

18.04.2009, 10:51

1. Benutz CreateFile mit Memory Mapping, Standard C und Standard C++ sind hier definitiv zu lahm, da es sich nur um Kompromisse handelt zwischen verschiedenen Systemen.

2. Wenn ich alle 10 Sekunden eine Datei öffne und 20.000x drum rumsteppe würde ich mir ernsthafte Gedanken machen die ~19 MByte nicht direkt in den Speicher zu stopfen oder mir ein besseres Konzept zu überlegen. Denn das klingt so wie du es hier darstellst als absoluten Murks.

Wenn es sich hierbei um einen Offset-Algo handelt um einen String zu konstruieren für Entschlüsselungen würde ich überlegen mehrere kleine Dateien zu machen mit Trash-Data.

Aber alle 10 Sekunden sowas machen klingt nach Murks.

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

3

18.04.2009, 10:53

Meine Kristallkugel lässt mich auch eher einen Design Fehler vermuten ;)

Warum musst du denn da so viel herumsteppen?

4

18.04.2009, 11:03

Nein es handelt sich nicht um schlappe 19MByte, sondern eher um 1GByte! Ich möchte den Ramspeicher nur ungerne mit 1GB zu pappen.

Ich muss so viel "herumsteppen" weil ich meine Terrain Daten lade. Das Terrain ist sehr groß und wird deswegen immer stückchenweise nachgeladen, damit ich den Seicher nicht vollstopfe. Die Daten des terrains würde ich gerne alle in eine Datei haben. Zuvor habe ich die Daten jeweils in 33*33 chars große dateien untergebracht, jedoch gab es dann bei der berechnung der Normalen Probleme, die jeweils äußersten Vertices eines Teiles des terrain haben haben nicht exakt die richtigen Normalen, wodurch Das Licht an den Rändern nicht sehr schön aussah.

5

18.04.2009, 11:10

Hm, aber selbst dafür solltest du nicht 20.000 mal hin und herspringen müssen.
Es sollte eigentlich möglich sein, die Daten so in der Datei zu speichern, dass du, wenn du alle Daten in der Nähe der Kamera laden willst, nur ein paar mal in der Datei hin und her springen musst.
Lieber dumm fragen, als dumm bleiben!

6

18.04.2009, 11:22

ich könnte es auf 2060 Sprunge reduzieren oder auf nur 20 Sprünge, dafür würde sich dann aber die daten Größe um etwa ein viertel (grob geschätzt) erhöhen.

Ich möchte nur ungerne die Datengröße erhöhen, da diese eh schon sehr groß ist, und 2060 sprünge sind dann auch nur 10 mal schneller als 20000 Sprünge.

p0llux

Treue Seele

Beiträge: 101

Wohnort: Aachen

Beruf: HiWi (theo. Inf.)

  • Private Nachricht senden

7

18.04.2009, 16:02

Warum musst du so oft pro Sekunde rumspringen?!

Das ist ganz klar ein Designfehler (wie schon alle sagten...). Du solltest einfach nochmal deine Lösung überdenken.

8

18.04.2009, 17:11

Die normalen könntest du doch mit in der Datei speichern.
Was ist das überhaupt für ein riesiges Terrain? Und wieso ist es eine Textdatei? Eine Binärdatei wäre doch sicher beim lesen schneller.
Lieber dumm fragen, als dumm bleiben!

9

19.04.2009, 01:51

Ist ja auch binär, zumindest lade ich diese binär.

Beneroth

Alter Hase

Beiträge: 969

Wohnort: Schweiz

Beruf: Software Entwickler

  • Private Nachricht senden

10

20.04.2009, 13:07

Zitat von »"unsigned long"«

1. Benutz CreateFile mit Memory Mapping, Standard C und Standard C++ sind hier definitiv zu lahm, da es sich nur um Kompromisse handelt zwischen verschiedenen Systemen.

2. Wenn ich alle 10 Sekunden eine Datei öffne und 20.000x drum rumsteppe würde ich mir ernsthafte Gedanken machen die ~19 MByte nicht direkt in den Speicher zu stopfen oder mir ein besseres Konzept zu überlegen. Denn das klingt so wie du es hier darstellst als absoluten Murks.

Wenn es sich hierbei um einen Offset-Algo handelt um einen String zu konstruieren für Entschlüsselungen würde ich überlegen mehrere kleine Dateien zu machen mit Trash-Data.

Aber alle 10 Sekunden sowas machen klingt nach Murks.


Zusatzfrage: Wirklich so langsam, das herumsteppen" ?

:? :?
Ich hab vor sowas auch zu benutzen, um bei einem eigenen Dateiformat mehrere Dateien in einer abzulegen.
(natürlich "steppe" dann beim einlesen..nicht beim schreiben..)

Werbeanzeige