OpenStreetMap-Daten nach MySQL (Die Zweite)

Im letzten Artikel haben wir festgestellt, dass das Datenbankschema, das von “osmosis” erzeugt wird, nicht so der Bringer ist, deshalb habe ich mir erlaubt mit großer Hilfe und Sachverstand meines Freundes fritsch ein eigenes Datenbankschema zu entwerfen und natürlich auch gleich noch den dazu fälligen Parser zu schreiben.

Ich habe heute viel dabei gelernt (nur kein EZT – Gruß an tacco):

  1. Versuche niemals selbst XML zu parsen. Es sieht ganz einfach aus und endet im Desaster.
  2. Versuchs wirklich nicht!
  3. Benutze lieber einen fertigen Parser, dem du mitgibst, was er mit den Tags anfangen soll.

Vor ein paar Tagen haben wir festgestellt, dass 400MB XML mit Xalan etwa 3 GB RAM brauchen, wenn sie zu einem DOM-Baum aufgebaut werden. Ein kleiner Test mit einer Perl-XML-Klasse, die eben dieses macht, hat heute fritschs neuerdings 8GB RAM in Sekundenschnelle komplett gefüllt. Deshalb bleibt nur sequentielles Lesen der Daten übrig. Java bietet dafür einen Sax-Parser, mit dem das ganz gut ging.

Mit etwas Quellcode war dann auch recht zügig eine SQL-Ausgabe erzeugt. Das Debugging dauerte aber Stunden, denn wenn in Zeile 1.500.745 des SQL-Imports ein Fehler auftaucht, merkt das MySQL erst nach etwa 1 Stunde. Eigentlich brauch ichs gar nicht zu erwähnen, es ist mehrfach passiert. Man braucht dann auch echt lustige Konstrukte:

elementstring.replaceAll("\\\\","\\\\\\\\").replaceAll("'","\\\\'")

Das kommt vom doppelt escapen. Einmal für den Java-String, und einmal für den RegExp. So bedeuten 4 Backslashes genau einen Backslash im zu durchsuchenden String.

Jetzt ist unser Server im dritten Durchgang beschäftigt und irritiert uns mit äußerst ungenauen Größenangaben der Tabellen. Mal sehen an welcher Stelle der 7.078.487 Zeilen er heute Nacht rausfliegt. Aktuell sind wir etwa bei Zeile 1.000.000.

Kommentare

2 Kommentare zu “OpenStreetMap-Daten nach MySQL (Die Zweite)”

  1. Peter Frühberger am September 28th, 2008 01:52

    Da Goby “SET CHARACTER SET UTF8;” vergessen hatte – wir brauchen mal einen svn – startet das ding grade nochmal neu.

    Zum erwähnten PERL oben:
    – Es handelte sich um XML::Simple, diese baut eine Hashstruktur des übergebenen XMLs auf und frisst dabei allen RAM den es so gibt 🙂

    – Selbstverständlich gibt es den SAX parser auch für perl. Aber für den Job ists recht egal welche Sprache, für die regexe wäre perl vielleicht cooler gewesen, aber egal – das ist es nicht was zeit kostet.

    Idee ist:

    Parse “Element”, manche nennen das flapsig Zeile (ich *G*), aber XML sieht kein \n vor, also zwingend vor => lies “dein Element” (nicht verwechseln mit Attribut) und rufe eine Callback funktion auf, parameter könnte der nodename sein usw.

    LG und gute n8
    Fritsch

  2. Tom am July 17th, 2009 00:49

    Hi,

    Good post – thanks (I understand German, can’t write it very well). One comment is that you seem to have your porn directory readable in the screenshot in the background..

    Anyway thanks and keep up the good posts!
    Tom

Schreibe einen Kommentar