Riesige Datenmengen im Prog unterbringen

Übersicht BlitzBasic Allgemein

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

onkelz89

Betreff: Riesige Datenmengen im Prog unterbringen

BeitragDi, Jul 10, 2007 14:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

ich beschreib erstmal kurz was ich machen will:

- eine noch unbestimmte Zahl an Teillevels (später klar)
- in jedem Level werden ca. 10t-30t Types neu geladen (und die alten vom vorlevel gelöscht)
- nur wie werden jetzt die neuen 10t-30t Types geladen???

Wenn ichs in Dateien speichere dann dauert das Laden ewig...
Gibt es in Blitz eine Möglichkeit für die Speicherung großer Daten und möglichst kein Speicherfresser...

###EDIT (hab nich viel Zeit leider deswegen schreib ich etwas unverständlich...)


Die Leveldaten müssen also möglichst schnell IMMER vorhanden und geladen sein nur nicht in Types, da es viel viel zu lahm würde...
UND man muss alles von den Daten wieder verändern können, koords, energie usw.

Speicherung/Ladung erfolgt immer zwischen 2 Abschnitten


Danke im Vorraus
 

Lumooja

BeitragDi, Jul 10, 2007 14:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde folgende Möglichkeiten in Betracht nehmen:

A) Gemeinsame Typen im Speicher (=RAM) lassen, und nur die wirklich unterschiedlichen Typen von Platte laden bzw. aus dem Speicher entfernen.

B) Benachbarte Typensätze (z.B. Zones oder Levels) im Speicher halten, und womöglich noch mit dem 7Zip (besser als RAR (und ZIP sowieso)) Algorithmus in den Speicher komprimiert abspeichern.

C) A und B kombiniert, dazu noch die Daten auf Platte 7Zippen, oder vielleicht sogar alles 7geZippt im Speicher haben Smile

Aber in der Praxis mit dem einfachsten anfangen, denn verlieren kann man dabei nichts.
  • Zuletzt bearbeitet von Lumooja am Di, Jul 10, 2007 14:58, insgesamt einmal bearbeitet

Jan_

Ehemaliger Admin

BeitragDi, Jul 10, 2007 14:57
Antworten mit Zitat
Benutzer-Profile anzeigen
das zauberwort ist streaming, lade nur das was du wahrscheinlich blad brauchst.

ist ein riesen aufwand sowas!
between angels and insects
 

Dreamora

BeitragDi, Jul 10, 2007 15:08
Antworten mit Zitat
Benutzer-Profile anzeigen
erst Mal würde ich mir überlegen was du überhaupt genau willst.

hier werden types geladen, da werden welche geladen ...

Ich glaub du verstehst schon die grundlegenden Sprachkonzepte nicht solange du "Types" lädst oder auch nur etwas ähnliches.
Drum erst Mal überlegen was hast du, was brauchst du und zwar klar spezifizieren. Dann kann man dir vielleicht sinnvolle Vorschläge geben.

Bis dahin: Streaming wird das sein was du brauchst.
Es gibt keine Magie die 100MB an Daten zu 1MB machen und 7Zip etc sind auch nur bedingt eine Lösung, denn Meshes etc können nur von der Platte geladen werden sofern du nicht selbst die daten ausliest und on the fly ein Mesh generierst (was etwas von dem sein wird was du machen musst)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

onkelz89

BeitragDi, Jul 10, 2007 15:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Tipps.
Geht leider nicht so ganz.
Also die vorschläge mit dem Übernehmen geht nicht, das es definitiv immer verschiedene sind die nichts miteinander zutun haben

Mit dem 7Zip geht glaub auch nicht... Man müsste es ja zum bearbeiten ständig entpacken und packen.. was wiederum zu geschwindigkeitsverlust führt (man müsste halt testen wie lange und kann blitz sowas?)

Streaming geht auch nicht leider, da ich alle 10t-30t Types brauch Sad

PS: das heißt nicht dass alle Types jede Sekunde auch durchlaufen werden, aber es kann jede Sekunde dazu kommen...

##Edit

Nicht falsch verstehen ich möchte nicht 100 zu 1 mb machen. nur wenn ich ca. 300t Types ständig habe, wird das extrem lahm. Es muss doch ingame andere möglichkeiten geben... nur schnellere und weniger Ram-fressend
 

Dreamora

BeitragDi, Jul 10, 2007 15:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Nochmal, es geht nicht.

Entweder du machst es Streaming so das nur im RAM ist was gebraucht wird oder du hast 2GB RAM Verschleiss während dem editieren und bringst dem Spiel streaming bei.

Denn was im Editor läuft muss net zwangsweise das gleiche sein wie beim Enduser.

Und nur so als randbemerkung: Es heisst k nicht t für "kilo" = tausend (genau genommen 1024)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Lumooja

BeitragDi, Jul 10, 2007 15:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Klar, die 30t Daten (meinst du sowas wie 30000 mal die Größe eines Datensatzes, z.B. 30000 * 16 Bytes?) müssen schon als B3D variablen vorhanden sein (also mit "New Type" als Liste angelegt). Mit dem 7Zip hab ich nur gemeint das das damit schneller gehen würde die nächsten "30000*16" Bytes von Platte zu lesen, außer wenn alle die 30t Datensätze gepackt in the Speicher passen, dann gehts halt noch schneller als von Platte zu lesen.

Jetzt hab ich auch noch den Verdacht, daß dein eigentliches Problem nur die Zeit ist, in der eine 300000 lange liste durchgewühlt wird. Dann kannst du doch nur ganz einfach 10 seperate 30000 listen angelegen (oder einen Anfangs- und Endpointer der zu lesenden Untermenge in der Liste festlegen), oder reicht dann den Speicher nicht aus?

Xeres

Moderator

BeitragDi, Jul 10, 2007 15:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Irgendwie komme ich nicht ganz dahinter, wozu du überhaupt so viele Types benötigst. Keine Ahnung wie du die Levels aufbaust, aber wenn 10000 - 30000 Types (mit wie vielen Fields durchschnittlich?) verwendet werden, würde ich doch erst mal versuchen, diese Leveldateien so klein wie möglich zu halten.
Bei zu großen Datenmengen wirst du wohl ein Load-Screen verwenden müssen - oder versuchen Threaded-loading zu realisieren wenn das spiel das grundsätzlich hergibt.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

ByteCroc

BeitragDi, Jul 10, 2007 15:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Du schreibst oben das du die Daten in Types hast, dann sollen sie aber doch nicht in Types sein, da sie zu langsam sind.

Arrays sind schneller, wenn du Konstanten einrichtest kannst du sie auch mit einem Namen ansprechen

Const ENERGIE 10

Dim Feld(30000)

x = Feld(ENERGIE)

In einer For Next Schleife durchlaufen lassen zum abspeichern.

Oder alles erst in eine Bank packen und abspeichern, die Bank lädt und speichert evtl. schneller, aber das musst du austesten.
 

onkelz89

BeitragDi, Jul 10, 2007 15:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Die 30.000 Types sind durchschnittlich mit 40 Fields belegt.
Es sind nicht nur Leveldaten wie zB (Wände,Türen usw)
Es sind auch Objekte im Level, Menschen, Tiere eigentlich alles was in dem Bereich anzutreffen ist. Man kann aber zB ein Objekte "mitnehmen" dann ist es nichtmehr in dem Level sondern im Nächsten.

Die Types sind nur Objekte / DInge alles was im MOMENTANEN Level ist.
Die Restlichen Daten(werden beim Laden in Types umgewandelt) sollen anders gespeichert werden.
Ich weiß nicht was mit dem 7Zip gemeint ist. Wie kann ich 7Zip Dateien in den Ram laden und dann daraus Dateien laden.. aus denen ich dann Werte auslese gibts dafür ein Tut?

Mit der Menge naja... es sind nunmal leider soviele.. falls es irgendwie möglich ist und ich das Problem weniger habe werdet ihr mich nach der ersten Demo verstehen Wink

Hoffe es gibt da neMöglichkeit sonst müsste ich das "Gesamtpacket" abspecken...
 

Lumooja

BeitragDi, Jul 10, 2007 16:38
Antworten mit Zitat
Benutzer-Profile anzeigen
onkelz89 hat Folgendes geschrieben:
Ich weiß nicht was mit dem 7Zip gemeint ist. Wie kann ich 7Zip Dateien in den Ram laden und dann daraus Dateien laden.. aus denen ich dann Werte auslese gibts dafür ein Tut?

Dafür müßte man Betriebssystem API's verwenden, z.B. auf Windows: GlobalAlloc(), GlobalLock(), RtlMoveMemory(). Diese kann man dann einfach in einer .decls in Blitz3D definieren.

Da 7Zip Open Source ist, gibst dafür auch source code, aus den man den pack- und entpackalgorithmus in eine .DLL Datei für Blitz3D schreiben müßte (Entpacken: Funktion die die Anfangsaddresse und Länge der gepackten Daten nimmt, und Anfangsadresse und Länge der entpackten Daten liefert; Packen: Funktion die eine Anfangsaddress und Länge nimmt, und Anfangsaddresse und Länge der gepackten Daten liefert).

Das wird warscheinlich ziemlich mühsam sein, und wenn ich das schreiben würde, könnte das schon ein paar Wochen dauern Smile

Außerdem sehe ich das ganze garnicht so sinnvoll das es die Mühe wert wäre, da jeder genutzte Speicher den Rechner sowieso verlangsamt, sei es noch so gut gepackt.

Jetzt hab ich eine neue Idee: eine .DLL in C für Blitz3D schreiben die "fread(buffer,16384,1,f);" benutzt. Damit geht das lesen von Platte wahnsinnig schnell. Ich hab vor einiger Zeit ein Test-Programm mit dem entsprechenden "fwrite();" geschrieben, und es schreibt eine Datei der Größe 100,000,000 Bytes in 0.078 Sekunden auf einem Server, und in 8.5 Sekunden auf meinem alten Laptop. Lesen hab ich noch nicht getestet, aber es dürfte noch viel schneller sein.

EDIT: Gerade getestet: lesen von 100,000,000 Bytes Datei (=95MB) geht in 0.12 Sekunden auf meinem Laptop.

PS. Wen's interessiert, hier ist der C source code für das schreiben:
Code: [AUSKLAPPEN]
#include <stdio.h>
#include <windows.h>
#define bs 16384L
#define xs 1024L
int main(int argc, char **argv)
{
   unsigned long ms=0L;
   char s[bs]="";
   char filename[254]="test.dat";
   printf("fwrite 0.0\n");
   FILE *f;
   if (argc<3)
   {
      printf("fwrite <filename> <bytes>\n");
      return(1);
   } else {
      strcpy(filename,argv[1]);
      ms=atol(argv[2]);
   }
   double t1=GetTickCount();
   f=fopen(filename,"wb");
   int done=0;
   unsigned long i=0L;
   while(done==0)
   {
      fwrite(s,bs,1,f);
      i+=bs;
      if((i%(bs*xs))==0)
      {
         printf("%.18ld\r",i);
         //Sleep(80);
      }
      if ((unsigned long)i+bs>=ms) done=1;
   }
   fwrite(s,ms-i,1,f);
   printf("%.18ld\n",ms);
   fclose(f);
   double t2=GetTickCount();
   printf("Done. Time Elapsed: %f seconds. %f bytes per second.\n",(t2-t1)/1000.0,ms/((t2-t1)/1000));
}
 

Marek

BeitragDi, Jul 10, 2007 17:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Du meinst mit 10t also schon 10 Tausend und nicht 10 Terra, oder? Der Unterschied:

10 Tausen (10k)= 10*1000
10 Terra (10t)= 10*1000000000000
(dazwischen kommen noch Mega(m) und Giga(g), sollten bekannt sein)
MfG Marek
Wer lesen kann ist klar im Vorteil...
 

onkelz89

BeitragDi, Jul 10, 2007 17:16
Antworten mit Zitat
Benutzer-Profile anzeigen
OK erstma vielen dank für die Tipps und Hilfen.

Problem ist nur ich hab kein Programm womit ich Dll erstellen kann bzw. man braucht doch ein Programm um in C zu programmieren oder? Hab vor langer Zeit mal damit experimentiert.

Wie kommt es überhaupt das der Befehl dann soviel schneller ist. Und wie sieht es bei 10000 dateien aus die jeweils nur 90 kb klein sind geht das auch so schnell? Weil ich glaub nur das öffnen und schließen dauert wirklich lange, nicht das auslesen an sich...

EDIT t hatte ich für tausend benutzt Wink werde es demnächst ausschreiben...
 

Marek

BeitragDi, Jul 10, 2007 17:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn jede Datei(ich schätze mal für die einzelnen Levels?) "nur" 90KB groß ist, warum lädst du nicht die Levels immer dann, wenn du sie brauchst?

Ich meine, man braucht ja nicht gleich alle Levels, man kann ja so oder so nur auf einem gleichzeitig spielen^^
Wer lesen kann ist klar im Vorteil...
 

onkelz89

BeitragDi, Jul 10, 2007 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, jede Datei ist für ein Objekt und manchmal (sogar sehr oft Wink) muss ich mehrere Hundert wenn nicht Tausend Obejkte laden:
-Kollisionen
-Überprüfung - Status
-vorhanden?
usw.

leider geht es anderes nicht
 

Lumooja

BeitragDi, Jul 10, 2007 17:51
Antworten mit Zitat
Benutzer-Profile anzeigen
onkelz89 hat Folgendes geschrieben:
Problem ist nur ich hab kein Programm womit ich Dll erstellen kann bzw. man braucht doch ein Programm um in C zu programmieren oder? Hab vor langer Zeit mal damit experimentiert.

Also wenn du mit C nicht so gut vertraut bist, dann ist es wohl einfacher daß es jemand anderes schreibt. Ich kanns mal versuchen, aber nichts versprochen Smile Einen Freeware C++ Compiler gibts bei Microsoft's Webseite, such mal nach "Visual C++ 2005 Express Edition", damit kann man im Grunde alles machen (was für Blitz3D sinnvoll ist), außer 64 bit Windows Programme.

Zitat:
Wie kommt es überhaupt das der Befehl dann soviel schneller ist. Und wie sieht es bei 10000 dateien aus die jeweils nur 90 kb klein sind geht das auch so schnell? Weil ich glaub nur das öffnen und schließen dauert wirklich lange, nicht das auslesen an sich...

Ich hab vor langem mit C rumgespielt, weil ich ein Programm haben wollte das eine Platte vollfüllt (wegen Datenschutz), und es sollte natürlich so schnell wie möglich sein. Soweit ich mich noch erinnern kann, kam ich nach zahlreichen Tests zum Ergebnis das gerade die blockgröße 16384 (das gilt für alle Dateigrößen, bei kleineren als 16384 langen Dateien liest man natürlich nur die Dateigröße ein) die schnellste ist, frag mich nicht warum das so ist bzw. war Smile

Was langsam ist, ist das finden einer Datei in einem Verzeichnis auf der Platte, und wenn viele Dateien im gleichen Verzeichnis sind, dauert das finden einer Datei ewig. Darum sollte man nie mehr als um so 128 Dateien in einem Verzeichnis haben, aber auch das ist schon zuviel. Das öffnen und schließen von Dateien dauert auch relativ lange. Darum solltest du nur eine Datei haben, die alle Levels enthält. Mit dem fseek() kann man dan in Mikrosekunden Schnelle auf die richtige Stelle innerhalb der großen Datei springen. Beim Speichern muß man dan die große Datei in 2 oder 3 Teile zerlegen (Anfang der Datei+Zu Speicherndes Level+Ende der Datei), aber das geht auch in Sekundenschnelle.
 

onkelz89

BeitragDi, Jul 10, 2007 18:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstmal danke für die Tipps mit den Dateien.. Ich dachte nicht das es erschwert wenn viele Dateien in einem Verzeichnis sind (bei direkter Pfadangabe) oder meintest du nur wenn man aus denn 500 Datein zB eine Datei raus filtert.
Gilt das selbe auch für Ordner?

Das mit dem Programm mach dir die Mühe nur wenn du es auch gebrauchen könntest ich weiß noch nicht vielleicht reichen schon die bisherigen Tipps aus. Aber finds voll nett das du es anbietest Very Happy

Das mit der "nur eine Datei" ist sehr sehr schwer in meinem Fall aber ich werde versuchen zu reduzieren.

Auf jeden Fall nochmal vielen Dank an alle !!!
 

Lumooja

BeitragDi, Jul 10, 2007 19:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Könntest du mal ein Beispiel zeigen, wie deine variablen in Blitz3D angelegt sind, also nur die die du speichern und laden willst.

Ich könnte mal ein bischen rumspielen und testen wie man die lade- und speicherzeit der variablen minimieren kann.

Gut zu wissen wäre auch wieviele dieser Datensätze in der Praxis vorhanden sind, du sprachst von 10000?
 

onkelz89

BeitragDi, Jul 10, 2007 19:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Embarassed hm es gibt noch keine Praxis, da ich erst den besten Weg finden möchte (hab dieses Projekt schon 3 mal begonnen und nach ca. 3-max 5 Monaten abgebrochen weil ich zuviel Praxis und zuwenig Theorie gemacht habe Wink

Bisher bleibe ich fast nur bei der Theorie. Hab halt nur einen Editor für Häuser zu erstellen geschrieben. Davon könnte ich einen Ausschnitt zeigen (sind auch Types)

Code: [AUSKLAPPEN]
While Not Eof(filein)
      teil$=ReadString( filein)
      zahl0=Instr(teil$,"#")
      zahl1=Instr(teil$,",")
      teilx = LSet(teil$,zahl1-1)
      
      teil$=RSet(teil$,zahl0-zahl1)
      zahl0=Instr(teil$,"#")
      zahl1=Instr(teil$,",")
      teily = LSet(teil$,zahl1-1)
      
      teil$=RSet(teil$,zahl0-zahl1)
      zahl0=Instr(teil$,"#")
      zahl1=Instr(teil$,",")
      teilz = LSet(teil$,zahl1-1)
      
      teil$=RSet(teil$,zahl0-zahl1)
      zahl0=Instr(teil$,"#")
      zahl1=Instr(teil$,",")
      teilinfo = LSet(teil$,zahl1-1)
      
      teil$=RSet(teil$,zahl0-zahl1)
      zahl0=Instr(teil$,"#")
      zahl1=Instr(teil$,",")
      teilgrad = LSet(teil$,zahl1+3)
      
   
         o.o = New o
         o\x = teilx
         o\y = teily
         o\z = teilz
         o\info= teilinfo
         If teilinfo=1 Then o\obj=CopyEntity(wand)
         If teilinfo=2 Then o\obj=CopyEntity(tur)
         If teilinfo=3 Then o\obj=CopyEntity(fenster)
         If teilinfo=4 Then o\obj=CopyEntity(tor)
         If teilinfo=0 Then o\obj=CopyEntity(boden)
         If teilinfo=5 Then o\obj=CopyEntity(zaun)
         If teilinfo=6 Then o\obj=CopyEntity(zauntor)
         PositionEntity o\obj,o\x,o\y,o\z
         EntityAlpha o\obj,1
         EntityColor o\obj,255,255,255   
         o\grad = teilgrad
         TurnEntity o\obj,0,teilgrad,0
   Wend


Datei:
Code: [AUSKLAPPEN]
-8,0,4,1,0#
-8,0,0,1,0#
-4,0,0,1,90#
0,0,0,1,90#
0,0,4,1,180#
0,0,8,1,180#
-4,0,8,1,270#
-8,0,8,1,270#


Ist jetzt ein Beispiel... Aber so in etwa nehme ich die Infos aus Dateien... Es gibt bestimmt bessere Wege zum Ziel, aber genau darum warte ich ja noch bis ich wieder NUR Praxis mache Wink
 

ByteCroc

BeitragDi, Jul 10, 2007 19:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Wäre es nicht besser wenn du deine Leveldaten Binär speichern würdest ?

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group