Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Welches Tabellenformat für große Datenmengen ?

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Welches Tabellenformat für große Datenmengen ?

    Hallo,

    ich habe einige große CSV-Dateien (ca. á 300 MB) die ich in eine MySQL-Tabelle einlesen und anschließend auslesen möchte. Ich habe ein gewisses Suchmuster und speichere dann einige Werte (ca. 10 MB).

    Der Verarbeitungsprozess dauert aktuell pro Datei einige Stunden. Wie kann man den Prozess beschleunigen und hilft es einen anderes Tabellenformat zuwählen ?

    Ich verwende aktuell InnoDB auf meinem rootDS.

    Vielen Dank für euren Support.

  • #2
    Zitat von puwu Beitrag anzeigen
    Der Verarbeitungsprozess dauert aktuell pro Datei einige Stunden.
    Was machst du da genau?
    Ließt du die Daten nur ein, oder bearbeitest du sie bei dieser Gelegenheit noch?

    300MB sind jetzt keine zu großen Mengen für eine Datenbank.
    [URL="http://php.net/manual/en/migration55.deprecated.php"]mysql ist veraltet[/URL] [URL="http://php-de.github.io/jumpto/mail-class/"]Mails senden: Ohne Probleme und ohne mail()[/URL]
    [PHP]echo 'PS: <b>Meine Antwort ist keine Lösung, sondern nur eine Hilfe zur Lösung.</b>';[/PHP]

    Kommentar


    • #3
      Hallo,

      meinen Server zwingt das schon die Bearbeitung schon fast in die Knie

      Ich lese die CSV in eine Tabelle (temp) mit meist ca. 1,5 Mio Einträgen ein. Dieses einlesen dauert schon 2-3 Stunden und anschließend mache ich die Auswertung, speicher die Ergebnisse in anderen Tabellen und lösche dann die temp-Tabelle.

      Das ganze muss ich 200x machen und die Datenbank wächst dadurch rasant und die Performance lässt hierdurch natürlich auch nach.

      Gibt es Referenz-Werte wieviel RAM usw ein Server bei dieser Datenmenge haben sollte ?

      Kommentar


      • #4
        Kommandozeile oder PMA?
        [COLOR="#F5F5FF"]--[/COLOR]
        [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
        [COLOR="#F5F5FF"]
        --[/COLOR]

        Kommentar


        • #5
          Was hält dich davon ab die CSVs direkt in die Datenbank zu laden und erst dann daraus Daten auszuwerten und in die Finale Tabelle zu schieben ?

          Gerade bei CSV ist es herzallerliebst egal wieviel RAM dein server hat, denn du wirst immer nur eine Zeile im Speicher haben, wenn du das ganze richtig angehst.
          [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

          Kommentar


          • #6
            Ich lade die Datei mit fopen, da ältere CSV-Dateien teilweise ein anderes Format (Spaltenstruktur und mal mit Apostroph mal ohne) haben.

            Vielleicht ist fopen nicht optimal, aber mit LOAD INTO oder per Konsole kann ich die CSV leider nicht laden.

            Haben die unterschiedlichen Tabellenformate einen großen Einfluss auf die Performance?

            Kommentar


            • #7
              Definiere "kann ich die CSV leider nicht einlesen".

              Ja, InnoDB ist beim Einfügen leicht langsamer als MyIsam. MyIsam wäre für deinen Fall so oder so geeigneter.

              Mittels fopen sollte das auch schneller gehen. Prepared Statements verwenden (nur 1 Mal initialisieren!) und 1 Zeile im RAM halten.
              [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

              Kommentar


              • #8
                Die alten CSV-Dateien haben weniger Spalten und die reihenfolge ist teilweise auch anderes. Desweiteren werden bei den älteren Dateien keine Apostrophe angebenn.

                Danke für den Tip mit den Prepared Statements und der MyIsam.

                Kommentar


                • #9
                  CSV ist CSV, mit CSV kann MySQL LOAD INTO auch umgehen, du kannst da das format spezifizieren.

                  http://dev.mysql.com/doc/refman/5.1/de/load-data.html

                  Siehe FIELDS ENCLOSED BY, TERMINATED BY, ESCAPED BY
                  [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                  Kommentar

                  Lädt...
                  X