Ankündigung

Einklappen
Keine Ankündigung bisher.

Variablen-Speicherkapazität (insgesamt/noch frei) ermitteln

Einklappen

Neue Werbung 2019

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

  • Variablen-Speicherkapazität (insgesamt/noch frei) ermitteln

    Hallo,

    ich versuche derzeit, eine große Menge an Datensätzen in eine DB zu speichern.
    Die Datensätze (Name: 'datensatz_n') hole ich aus einem Formular:
    PHP-Code:
    for($i=0;$i<$anzahl_datensätze;$i++){
    $id 'datensatz_'.$i;
    $datensatz $_POST[$id];
    $cmd "INSERT INTO....";

    Dann kam mir die Idee, das Ganze eleganter zu machen und erst einmal alle Datensätze per POST zu ermitteln und diese in ein Array zu speichern:
    PHP-Code:
    for($i=0;$i<$anzahl_datensätze;$i++){
    $id 'datensatz_'.$i;
    $datensatz[$i] = $_POST[$id];
    $cmd "INSERT INTO....";

    Diese Variante ist deshalb geschickter für mich, da ich im weiteren Skriptverlauf Vorteile habe, wenn ich noch auf alle Datensätze zugreifen kann, was mir bei der ersteren Methode nicht mehr möglich ist, da ja immer der alte Datensatz überschrieben wird...

    Nun meine Frage:
    Sehr wahrscheinlich liegt das an dem Überschreiten der Speicherkapazität des Arrays, oder? Wie kann ich denn die maximale Speicherkapazität einer Variablen bzw. eines Arrays ermitteln bzw. wie ermittle ich den noch freien Speicher einer bereits belegten Variable?

    Frage Nr. 2:
    Kann ich die Speicherkapazität irgendwie hochsetzen bzw. einen großen Datentyp deklarieren (z.B. long oder so)? Gibts da Möglichkeiten?

    Über einen Denkanstoß wäre ich sehr dankbar.

    Lg

  • #2
    1. Was heißt viele Datensätze in Zahlen?
    2. INSERT nicht in einer Schleife wiederkehrend verwenden, stattdessen Multi-Insert
    Competence-Center -> Enjoy the Informatrix
    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

    Kommentar


    • #3
      Du kannst ein Array vollhauen, bis das in der php.ini eingestellte "memory_limit" erreicht ist.

      Aber mit "wahrscheinlich" kommt man nicht sehr weit. Drehe das Error-Reporting hoch, um den Fehler zu finden.
      Die Deutsche Rechtschreibung ist Freeware! Du darfst sie kostenlos nutzen, allerdings ist sie nicht Open Source, d.h. Du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

      Kommentar


      • #4
        Du stammst wohl nicht aus dem PHP Universum... Sonst würdest du die Vorzüge der foreach-Schleife kennen und wie uha es schon gesagt hat, kannst du Variablen vollpacken bis das memory_limit erreicht ist.
        Current Projects: http://www.welten-buch.de, http://neu.zooadoo.de

        Kommentar


        • #5
          Was heißt viele Datensätze in Zahlen?
          Gar nicht mal so viele, an der Zahl sind es 57.
          Das Problem ist, dass jeder Datensatz ein rießiges Textdokument enthält (als Worddokument zwischen 40-100 Seiten Text).

          Wenn ich das Skript laufen lasse, lädt es ne Weile und bricht dann einfach ab...

          Aber mit "wahrscheinlich" kommt man nicht sehr weit. Drehe das Error-Reporting hoch, um den Fehler zu finden.
          Was meinst du damit genau? Kann ich einen Skriptfehler direkt anzeigen lassen?
          EDIT:
          Habe die Funktion "error_reporting(E_ALL); aufgerufen --> keine Fehlermeldungen...

          Kommentar


          • #6
            lädt es ne Weile und bricht dann einfach ab...
            timeout gibt es auch noch ... http://php.net/manual/de/function.set-time-limit.php
            The string "()()" is not palindrom but the String "())(" is.

            Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
            PHP.de Wissenssammlung | Kein Support per PN

            Kommentar


            • #7
              Error reporting an, dann weißt du obs an der Dateigröße oder am Timeout liegt. Beides kann man allerdings konfiguieren.
              Current Projects: http://www.welten-buch.de, http://neu.zooadoo.de

              Kommentar


              • #8
                Also, für jedes Formular, auf das ich diese Schleife anwende (also sprich jede Tabelle, die ich mit Datensätzen aus einem Formular befüllen möchte) und bei dem es auch funktioniert, kommen folgende Rückgabewerte von error_reporting(E_ALL):
                - beim ersten Schleifendurchlauf (also erste Array-Belegung) den Rückgabewert '22519'
                - bei allen weiteren Durchläufen der Wert '30719'.

                ABER: Bei dem Formular mit den Riesendatensätzen, bei dem das Skript einfach abbricht, erscheint auch keine Fehlermeldung (ich vermute jedoch das liegt daran, dass das Skript einfach abbricht und gar nicht mehr zum error_reporting()-Befehl kommt...).

                Was soll/kann ich tun?

                Kommentar


                • #9
                  In den Log-Files könnte man eventuell auch Infos finden
                  Die Deutsche Rechtschreibung ist Freeware! Du darfst sie kostenlos nutzen, allerdings ist sie nicht Open Source, d.h. Du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

                  Kommentar


                  • #10
                    Wenn ich das Skript laufen lasse, lädt es ne Weile und bricht dann einfach ab...
                    Also File-Upload?! Das hast Du bisher nicht erwähnt!
                    Dann siehe erstens #6 und zweitens bitte aml diese ErrorReporting-Einstellungen testen:
                    PHP-Code:
                    error_reporting ( -);
                    ini_set 'display_errors'true ); 
                    ohne das ini_set( ... ); werden die Errors nämlich nur protokolliert in den Logs, aber nicht angezeigt!
                    Competence-Center -> Enjoy the Informatrix
                    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                    Kommentar


                    • #11
                      Oh mein Gott es lag tatsächlich am time-limit!

                      Habe mal vor die Schleife ein 'set_time_limit(60);' gesetzt und siehe da, er hatte genug Zeit um alle Datensätze zu übermitteln!!

                      Nun noch ne kleine Frage:
                      Kann ich das time_limit() auf unbegrenzt setzen oder wie weiß ich im Voraus, welcher Zeitraum zum Übermitteln der Daten benötigt wird? Es ist nämlich duraus wahrscheinlich, dass irgendwann auch die 60s nicht mehr ausreichen werden...

                      lg

                      Kommentar


                      • #12
                        http://php.net/manual/de/function.set-time-limit.php
                        Current Projects: http://www.welten-buch.de, http://neu.zooadoo.de

                        Kommentar


                        • #13
                          Sorry, da war ich etwas unaufmerksam.. Vielen Dank!

                          Ein kleines Problem habe ich noch bzw. etwas stört mich an der Sache noch:
                          Warum benötigt der Server für die Speicherung der Daten in ein Array mehr Rechenzeit als beim separaten Speichern in immer dieselbe Variable? Eigentlich sollte das doch rechenzeittechnisch keinen Unterschied machen, oder?

                          Welche Methode würdet Ihr bevorzugen?

                          Lg

                          Kommentar


                          • #14
                            Tut er nicht, zumindest nicht in dem Ausmaß von Sekunden, das was du als langsam empfindest ist mit aller größter Wahrscheinlichkeit der Rest des Scripts.

                            Generell solltest du dich Client-seitig auf eine HTML-Array-Struktur festlegen und diese dann nur Server-seitig validieren um sie danach zu iterieren ( foreach ). Es ist auch zu empfehlen nicht für jeden Datensatz ein neues Query zusammenzukleistern, sondern nur einmal ein Query vorzubereiten ( perpared statements ) und dieses dann mit den jeweiligen Daten eines Datensatzes gegen die Datenbank zu feuern.
                            [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


                            • #15
                              Zitat von tr0y Beitrag anzeigen
                              Tut er nicht, zumindest nicht in dem Ausmaß von Sekunden, das was du als langsam empfindest ist mit aller größter Wahrscheinlichkeit der Rest des Scripts.
                              Hmm... aber warum muss ich dann nur bei der Methode mit dem Array die Funktionszeit (set_time_limit() ) erhöhen? Wäre die Rechenzeit bei beiden Methoden gleich lang, dann müsste er doch bei beiden Methoden auch abbrechen, sofern ich kein set_time_limit() verwende, oder?

                              Generell solltest du dich Client-seitig auf eine HTML-Array-Struktur festlegen und diese dann nur Server-seitig validieren um sie danach zu iterieren ( foreach ). Es ist auch zu empfehlen nicht für jeden Datensatz ein neues Query zusammenzukleistern, sondern nur einmal ein Query vorzubereiten ( perpared statements ) und dieses dann mit den jeweiligen Daten eines Datensatzes gegen die Datenbank zu feuern.
                              Hui... sorry aber da komme ich nicht mehr mit
                              Könntest du das nochmal für einen DAU wie mich wiederholen
                              Ich lese mich nachher gleich mal in Multi-Insert ein, wie es ein Vorposter emfohlen hat...

                              Kommentar

                              Lädt...
                              X