php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 25.06.2008, 14:39  
Erfahrener Benutzer
 
Registriert seit: 24.05.2008
Beiträge: 173
PHP-Kenntnisse:
Anfänger
Griffith sorgt für eine eindrucksvolle AtmosphäreGriffith sorgt für eine eindrucksvolle Atmosphäre
Standard Zweidimensionale Karte

Hallo,

die Karte, von der ich hier spreche, ist im Prinzip eine Bitmap.

Sie hat eine Größe von etwa 1000x1000 und auf jeder Koordinate wird ein einzelner Wert gespeichert. Beispielsweise eine 0 für ein leeres Kartenfeld und eine 1 für ein Hindernis.

Ich kann mich nicht entscheiden, ob ich diese Karte über eine Datei verwalten soll oder über eine Datenbank.

Ich möchte anschließend lediglich einzelne Felder auf ihren Inhalt abfragen können bzw. alle Felder in einem Rechteck auf der Karte.

Pro/Contra Datei
+ schneller Zugriff auf die gewünschte Koordinate (fseek)
+ kleinster Speicherbedarf
- bei jedem Zugriff wird auf die Festplatte zugegriffen.

Pro/Contra Datenbank
Tja, das ist die Frage. Ich erhoffe mir, dass weniger auf die Festplatte zugegriffen wird. Außerdem liegt die Karte dann an einem zentralen Speicherort.

Wie setzt man so eine Karte am besten mit einer Datenbank wie MySQL um?
Und welchen Weg der Speicherung (Datei oder Datenbank) würdet ihr mir empfehlen?

Ich bin für jeden hilfreichen Hinweis dankbar =)


mfg
Griffith

Geändert von Griffith (25.06.2008 um 14:44 Uhr).
Griffith ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 25.06.2008, 14:45  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Bei 1000x1000 und einem Flag pro Koordinate kommst Du bereits auf 1MB bzw. 1 Million Tableeinträge. Vielleicht solltest Du Dir eine Strategie überlegen, die Gesamt-Karte weiter zu unterteilen.

Vielleicht reicht Dir auch ein BIT, dann sparst Du etwas.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 25.06.2008, 15:09  
Erfahrener Benutzer
 
Registriert seit: 24.05.2008
Beiträge: 173
PHP-Kenntnisse:
Anfänger
Griffith sorgt für eine eindrucksvolle AtmosphäreGriffith sorgt für eine eindrucksvolle Atmosphäre
Standard

Ein Byte pro Feld trifft es eigentlich sehr gut. Ein Nibble mit 16 Möglichkeiten wäre bereits zu wenig.

Am schönsten wäre es glaube ich, wenn die Karte ununterbrochen im Arbeitsspeicher liegt.

Angenommen ich würde den HTTP-Server per Hand in C schreiben, so wäre die ideale Lösung ein ByteArray im Arbeitsspeicher, dass vom Start des Servers bis zum Herunterfahren des Servers im Arbeitsspeicher bleibt.

Nur würde ich gerne wissen, ob es auch eine Lösung für PHP gibt :\

Geändert von Griffith (25.06.2008 um 15:11 Uhr).
Griffith ist offline   Mit Zitat antworten
Alt 25.06.2008, 15:15  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Wie gesagt: resultierend 1MB. Als Datei ist's das eine, aber als Array im Speicher? Ich spekuliere mal: Das geht nicht gut. Unterteile die Karte in kleinere Quadranten und lade immer nur die in PHP nach. Vielleicht brauchst Du gar nicht so oft unterteilen, weil die Speicherauslastung ja quadratisch abhängig von der Kantenlänge ist.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 25.06.2008, 15:22  
Erfahrener Benutzer
 
Registriert seit: 24.05.2008
Beiträge: 173
PHP-Kenntnisse:
Anfänger
Griffith sorgt für eine eindrucksvolle AtmosphäreGriffith sorgt für eine eindrucksvolle Atmosphäre
Standard

Naja, wenn ichs als Datei mache, dann bringen mich Quadranten auch nicht weiter.

Immerhin reicht bei der Datei ein einziges fseek() und fread() um das gewünschte Feld einzulesen. Bzw. beim Einlesen eines Rechtecks auf der Karte ein fseek() und ein fread(Breite) pro Zeile.

Mit Quadranten würde es da nur unnötig komplizierter.

Aber was bringt es mir im Bezug auf die Datenbank?
Ich verstehe noch nicht ganz, wie du das mit den Quadranten meinst :\

Edit:
Ich sollte evtl noch anmerken, dass auf meinem Webserver sehr sehr oft auf diese Karte zugegriffen wird.
Fast bei jedem 4. Auruf schätze ich, wird auf die Karte zugeriffen. Von einem Feld bis hin zu einem Quadrat von 10 Feldern pro Aufruf.

Auch sind die Zugriffe sehr zufällig. Mal ist es ein Feld oben links auf der Karte, mal ein Feld völlig woanders. (Von Aufruf zu Aufruf)

Geändert von Griffith (25.06.2008 um 15:24 Uhr).
Griffith ist offline   Mit Zitat antworten
Alt 25.06.2008, 15:33  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Doch bringt was.
Wenn Du bspw. einen Zugriff auf Feld 400/800 hast (was auch immer Deine Anwendung genau macht) dann kannst Du vorher berechnen, in welchem Quadranten das Feld liegt und nur die Koordinaten dieses Quadranten einlesen. (Auch wenn der Vergleich mächtig hinkt: so ähnlich, wie das Google Maps veranstaltet...) Natürlich vorausgesetzt, Du speicherst die Quadranten in verschiedenen Dateien ab.
Bei einer Datenbank ist das wohl eher unerheblich.

Aber bitte: Ich habe so etwas noch nie versucht. Meine Antworten sind im Endeffekt Spekulation.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 25.06.2008, 15:45  
Erfahrener Benutzer
 
Benutzerbild von lazydog
 
Registriert seit: 02.04.2008
Beiträge: 4.032
lazydog befindet sich auf einem aufstrebenden Ast
Standard

Es gäbe auch die Möglichkeit, ausschliesslich die gesetzten (oder falls weniger, die nicht gesetzten) Punkte zu speichern und diese als x/y Paare in die DB zu schreiben. Das kann die Tabelle u.U massiv verkleinern. Diese können dann in einen zweidimensionalen Array gelesen werden.
__________________
Gruss
L
lazydog ist offline   Mit Zitat antworten
Alt 25.06.2008, 21:56  
Erfahrener Benutzer
 
Registriert seit: 24.05.2008
Beiträge: 173
PHP-Kenntnisse:
Anfänger
Griffith sorgt für eine eindrucksvolle AtmosphäreGriffith sorgt für eine eindrucksvolle Atmosphäre
Standard

Also bisher hatte ich mir so eine Tabelle vorgestellt:

Code:
CREATE  TABLE  `karte` (
   `x` SMALLINT  UNSIGNED NOT  NULL ,
   `y` SMALLINT  UNSIGNED NOT  NULL ,
   `wert` TINYINT  UNSIGNED NOT  NULL ,
   PRIMARY  KEY (  `x` ,  `y`  ) 
) ENGINE  =  MYISAM ;
Damit der Zugriff auf ein X-Y-Paar schnell ist, wird der PRIMARY-KEY für beide Spalten x und y angelegt. Ist das so korrekt?

Oder sollte ich die Tabelle doch anders aufbauen? Wie würde der Zugriff auf die einzelnen Koordinaten am schnellsten sein?

Und ja, gespeichert würden dann nur die Felder, in denen der Wert != 0 ist.
Dabei würden nur ca. die Hälfte der Felder in der Datenbank rumliegen.

Der Nachteil an der Datebank im Gegensatz zur Datei ist aber, dass zusätzlich noch die X-Y-Koordinaten und der passende Index dazu erstellt und verwaltet werden muss.

Allerdings ist die Datenbank dadurch auch etwas flexibler, falls ich die Karte mal erweitern möchte in ihrer Dimension. Aber das wird eh nie der Fall sein.

Edit:
Habe mal eine Tabelle mit 60.000 zufälligen Werten erstellt.
X-Y-Koordinaten zwischen (0|0) und (499|499).

Wenn ich jetzt den Bereich zwischen (100|100) und (200|200) anfordere, macht es scheinbar keinen unterschied, ob ich x und y als PRIMARY-KEY definiere oder nicht. Es dauert genauso lange. (Obwohl die Tabelle nciht mehr soritert war, habe einfach mal aufsteigend nach "wert" soritert).

Ich habe folgende Queries probiert, wobei das zweite mit BETWEEN ein bisschen schneller ist.

SELECT x, y, wert FROM `karte` WHERE x >= $untergrenze_x AND x <= $obergrenze_x AND y >= $untergrenze_y AND y <= $obergrenze_y

SELECT x, y, wert FROM `karte` WHERE x BETWEEN $untergrenze_x AND $obergrenze_x AND y BETWEEN $untergrenze_y AND $obergrenze_y

Insgesamt habe ich für den kleinen Bereich 0,043 Sekunden gebraucht. (ca. 2500 Datensätze)

Aber dass das mit den PRIMARY-KEY keine Auswirkung hat verwundert mich doch...

Geändert von Griffith (26.06.2008 um 00:23 Uhr).
Griffith ist offline   Mit Zitat antworten
Alt 26.06.2008, 06:43  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.265
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

In der Datenbank hast du den Vorteil, 0 Werte garnicht auffuehren zu muessen, wodurch sich die Datenmenge erheblich reduzieren koennte. Ausserdem kannst du die Tabelle als MEMORY anstatt MyISAM anlegen, dann liegt sie im Arbeitsspeicher des Datenbankservers. Aber ich bezweifle, dass MySQL damit Probleme hat ..

PS: Jetzt erst gelesen. Die Tabelle ist ja praktisch nur ein Index, da wuerde ich den Overhead Index-Spalte wohl eher weglassen. War Postgresql nicht die grosse Integer-Datenbank, die dafuer so gut geeignet ist? Vielleicht kannst du auch die verwenden ..
__________________
"Nuschel ich?" - "Was?"

Geändert von Chriz (26.06.2008 um 06:45 Uhr).
Chriz ist offline   Mit Zitat antworten
Alt 26.06.2008, 16:57  
Erfahrener Benutzer
 
Registriert seit: 24.05.2008
Beiträge: 173
PHP-Kenntnisse:
Anfänger
Griffith sorgt für eine eindrucksvolle AtmosphäreGriffith sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von Chriz Beitrag anzeigen
In der Datenbank hast du den Vorteil, 0 Werte garnicht auffuehren zu muessen, wodurch sich die Datenmenge erheblich reduzieren koennte. Ausserdem kannst du die Tabelle als MEMORY anstatt MyISAM anlegen, dann liegt sie im Arbeitsspeicher des Datenbankservers. Aber ich bezweifle, dass MySQL damit Probleme hat ..
Die Tabelle hat die 4-fache Größe der Datei.
Pro Feld benötige ich in der Datenbank 7/4 Byte (da nur jedes 4. Feld belegt ist und ein Datensatz 7 Byte groß ist).
Pro Feld benötige ich in der Datei 1 Byte.

Wenn der Index bei der Datenbank noch dazu kommt, kommt man auf die 4-fache Größe der Datei.
Den Index brauche ich um doppelte Einträge zu verhindern (Primary Key).

Die MEMORY-Engine kann ich nicht verwenden, weil es sich um sehr kritische Daten handelt. Sollte der Server abstürzen und die Daten sind weg, wäre das fatal.

Zitat:
Zitat von Chriz Beitrag anzeigen
PS: Jetzt erst gelesen. Die Tabelle ist ja praktisch nur ein Index, da wuerde ich den Overhead Index-Spalte wohl eher weglassen. War Postgresql nicht die grosse Integer-Datenbank, die dafuer so gut geeignet ist? Vielleicht kannst du auch die verwenden ..
Nun, die Tabelle könnte doch auch ungeordnet sein. Füge ich ein neues Feld hinzu (dort wo vorher ein leeres Feld war) wird der Datensatz ans Ende der Tabelle gespeichert und schon ist die Tabelle selbst kein Index mehr, sondern nur noch ne Anhäufung von Rohdaten.

Man müsste sicherstellen, dass die Datenbank immer sortiert ist.
Immerhin ändert sich die Karte nur ganz selten.

Edit:
Warum ist jeder Datensatz 7 byte groß, wenn es doch nur 2 SMALLINT und 1 TINYINT sind. Sollten es nicht 5 Byte sein?

Geändert von Griffith (26.06.2008 um 17:02 Uhr).
Griffith ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

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 an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
User karte ( x , y Kordinaten ) Mondschein PHP Tipps 2007 1 20.11.2005 12:30
Karte funktioniert nicht ganz richtig ( koardinaten system ) PHP Tipps 2005-2 7 15.06.2005 16:48
Broadcom Wireless Karte suter Server, Hosting und Workstations 0 18.05.2005 08:23
zweidimensionale Arrays für Templates aufbereiten? PHP Tipps 2005 6 22.03.2005 20:49
Fernsehen mit Satelliten Karte Off-Topic Diskussionen 1 05.09.2004 16:45
Karte Beitragsarchiv 13 02.09.2004 17:30
[Erledigt] WAs stimmt da nicht? PHP Tipps 2004 32 25.08.2004 14:05

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
zweidimensionale karte, zweidimensionale karten, weltkarte 2 dimensional, map mit felder php, zweidimensional karte, 1. weltkarte zweidimensional, karte zweidimensional, postgresql karte aus x und y werten, php karte, karte aus x y koordinaten php mysql, atlaskarten zweidimensional, zweidimensionale datenbank, xy karte tabelle php, php zweidimensionale karte, weltkarte bitmap, \php\ karte, weltkarte zweidimensional, grosse zweidimensionale weltkarte in db speichern, koordinarten karte php, php mysql soritertes array

Alle Zeitangaben in WEZ +2. Es ist jetzt 05:23 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum