Ankündigung

Einklappen
Keine Ankündigung bisher.

Sehr große JSON-Datei abarbeiten

Einklappen

Neue Werbung 2019

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

  • Sehr große JSON-Datei abarbeiten

    Hallo,
    mein Skript downloaded große JSON-Dateien (> 10000 Zeilen) per wget. Mein Problem ist nun, dass der Inhalt der JSON-Datei in die Datenbank müssen. Das übersteigt aber leider absolut die maximale Scriptlaufzeit. Eine Erhöhung ist leider keine Option.

    Könnt ihr mir irgendwelche Ratschläge geben, wie man sowas am besten angeht?

    Ich danke euch.


  • #2
    Das kommt auf einige Faktoren an:
    - Ist die Storage Engine transaktionell ?
    - Wird der Insert als Bulk oder einzeln abgesetzt ?
    - Wie beschäftigt ist der Server ?
    - Wie beschäftigt ist die möglicherweise entfernte Datenbank ?
    - Was machst du mit den JSON Daten bevor du sie ins Insert kippst ?
    - Warum musst du 10000 Zeilen ( Datensätze ? ) auf einmal abrufen ?
    [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


    • #3
      Noch mehr Fragen..
      - Wo tritt das Problem genau auf? Beim INSERT in die Datenbank?
      - Von welcher Datenbank sprichst du? MySQL?
      PHP-Klassen auf github

      Kommentar


      • #4
        Wie ich eben bemerkte, treten bei einigen Dateien schon beim Auslesen Probleme mit dem Memory Limit auf. Also ein weiteres Problem...

        Zitat von tr0y Beitrag anzeigen
        - Ist die Storage Engine transaktionell ?
        Ich weiß leider nicht genau, was das bedeutet. Ich benutze Laravel Eloquent.

        Zitat von tr0y Beitrag anzeigen
        - Wird der Insert als Bulk oder einzeln abgesetzt ?
        Einzeln in einer foreach-Schleife.

        Zitat von tr0y Beitrag anzeigen
        - Wie beschäftigt ist der Server ?
        Momentan läuft es noch lokal, aber Memory Limit und Laufzeit sind genauso wie bei meinem Hoster.

        Zitat von tr0y Beitrag anzeigen
        - Wie beschäftigt ist die möglicherweise entfernte Datenbank ?
        Garnicht.

        Zitat von tr0y Beitrag anzeigen
        - Was machst du mit den JSON Daten bevor du sie ins Insert kippst ?
        Nur aus der JSON-Datei auslesen.

        Zitat von tr0y Beitrag anzeigen
        - Warum musst du 10000 Zeilen ( Datensätze ? ) auf einmal abrufen ?
        Weil es nicht anders angeboten wird, ausser ich übersehe eine Möglichkeit nur Teile einer JSON-Datei auszulesen.

        Zitat von jspit Beitrag anzeigen
        - Wo tritt das Problem genau auf? Beim INSERT in die Datenbank?
        Beim Insert und beim Auslesen der runtergeladenen Datei.

        Zitat von jspit Beitrag anzeigen
        - Von welcher Datenbank sprichst du? MySQL?
        Ja.

        Kommentar


        • #5
          Na dann, auf gehts:
          - https://github.com/salsify/jsonstreamingparser
          - http://stackoverflow.com/questions/1...g-eloquent-orm
          [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
            Vielen Dank. Das Problem mit dem Insert habe ich gelöst. Leider arbeitet der JSON-Streamer nicht richtig. Er lässt zwischendurch immer mal wieder Keys aus und liest Einträge doppelt aus. Ich habe mit meinem Hoster geredet und ich darf mein Memory Limit auf maximal 250M erhöhen, leider reicht das für die ganz großen Dateien und normalem "file_get_contents()" immer noch nicht.

            Ist es vielleicht irgendwie möglich die Datei ab einer bestimmten Zeile zu teilen, ohne den ganzen Inhalt dabei auslesen zu müssen?

            Kommentar


            • #7
              Dann schau dich auf github um, es gibt mehr wie einen json streamer.
              [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


              • #8
                Du sprichtst immer von Zeilen. Zeilenendezeichen im JSON dienen nur der besseren manuellen Lesbarkeit der Daten.

                Wie sieht denn deine Struktur aus?
                Nur wenn diese Struktur extrem einfach ist, könnte über eine eigene Speziallösung nachdenken.
                Ansonsten geht es auf dem Weg von tr0y weiter.
                PHP-Klassen auf github

                Kommentar

                Lädt...
                X