Sinnvoll mit einer großen Array zu arbeiten?

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

  • Sinnvoll mit einer großen Array zu arbeiten?

    Hi,
    ich lese Daten aus einer DB aus, berechne diese und gebe sie in der Funktion als return in einer Array zurück.
    Diese 3D Array beinhaltet so einiges an Daten.
    Ich schätze mal auf ca. insgesamt so 300 Datensätze.

    Ist es da noch "ok" mit einer Array zu arbeiten?

    Was sagen die Profis?

  • #2
    warum nicht?

    nein ernsthaft sollte kein Problem darstellen.....
    <?php echo "ad astra"; ?>
    www.utopiafuture.de

    Kommentar


    • #3
      Original geschrieben von martin2
      warum nicht?

      nein ernsthaft sollte kein Problem darstellen.....
      "Könnte" ja sein, das Erfahrene Programmierer auf der PHP Ebene mit den Jahren gemerkt haben, dass sich eine Array nicht wirklich für größere, 3 bis 4 stellige Datensatzanzahlen eignet o.ä.!

      Kommentar


      • #4
        Wenn du die Daten brauchst, dann ist ein Array ein durchaus brauchbares Aufbewahrungsörtchen. Solltest du die Daten allerdings nicht alle brauchen, dann stellt sich mir die Frage:
        Warum liest du sie überhaupt aus?
        Wir werden alle sterben

        Kommentar


        • #5
          Original geschrieben von combie
          Wenn du die Daten brauchst, dann ist ein Array ein durchaus brauchbares Aufbewahrungsörtchen. Solltest du die Daten allerdings nicht alle brauchen, dann stellt sich mir die Frage:
          Warum liest du sie überhaupt aus?
          Natürlich braucht man die Daten.

          Kommentar


          • #6
            Man muss alle Datensätze auslesen, die gebraucht werden. Die Frage ist dann eher, wie man das macht. Entweder alle in ein Array speichern oder jeden einzeln auslesen, machen was man damit zu machen hat und wegwerfen. Manchmal geht es aber gar nicht einzeln, bspw. wenn man irgendwelche Matrizenoperationen macht.

            Die Größe eines Arrays unterliegt theoretisch keiner Beschränkung, da sie intern als Hash-Tabellen abgebildet werden. Allerdings ergibt sich daraus doch eine Beschränkung: Auf jeder Ebene wird die Anzahl der Elemente durch den Datentyp der Schlüssel begrenzt. Verwendet man zum Beispiel Integers als Keys, kann man nur PHP_INT_MAX Einträge haben (jeder davon wiederum PHP_INT_MAX Kinder, davon wieder jeder PHP_INT_MAX usw.).

            Man kann das durch String-Keys, zusätzliche Dimensionen oder Partitionierung auf mehrere Arrays locker umgehen. Allerdings stößt man bei so vielen Daten wahrscheinlich ans memory_limit oder max_execution_time. Ganz zu schweigen davon, dass wohl kaum eine Array-Funktion so große Arrays noch performant bearbeiten kann.

            Kommentar


            • #7
              Original geschrieben von onemorenerd
              Man muss alle Datensätze auslesen, die gebraucht werden. Die Frage ist dann eher, wie man das macht. Entweder alle in ein Array speichern oder jeden einzeln auslesen, machen was man damit zu machen hat und wegwerfen. Manchmal geht es aber gar nicht einzeln, bspw. wenn man irgendwelche Matrizenoperationen macht.

              Die Größe eines Arrays unterliegt theoretisch keiner Beschränkung, da sie intern als Hash-Tabellen abgebildet werden. Allerdings ergibt sich daraus doch eine Beschränkung: Auf jeder Ebene wird die Anzahl der Elemente durch den Datentyp der Schlüssel begrenzt. Verwendet man zum Beispiel Integers als Keys, kann man nur PHP_INT_MAX Einträge haben (jeder davon wiederum PHP_INT_MAX Kinder, davon wieder jeder PHP_INT_MAX usw.).
              Zeig mir den Server, auf dem du über 4 Milliarden Einträge pro Array speichern willst. Die PHP_INT_MAX Größe ist das letzte Limit, das dir Sorgen machen sollte.

              Kommentar


              • #8
                Völlig klar, dass sowas absolut praxisuntauglich ist, selbst in anderen Programmiersprachen. Ich habe nur erklärt, dass es theoretisch kein Limit gibt.
                Du hast mich übrigens noch auf einen Fehler aufmerksam gemacht: Es sind eigentlich 2 x PHP_INT_MAX Integer-Keys möglich, wenn man sie selbst setzt und nicht mit $array[] = foo arbeitet.

                Kommentar


                • #9
                  Es sind eigentlich 2 x PHP_INT_MAX Integer-Keys möglich
                  PHP_INT_MAX x 2 +1 oder nicht?
                  PHP-Code:
                  var_dump(array(PHP_INT_MAX*2+1=>1)); 
                  ergibt
                  Code:
                  array(1) {
                    [-1]=>
                    int(1)
                  }

                  Kommentar


                  • #10
                    Original geschrieben von PHP-Desaster
                    PHP_INT_MAX x 2 +1 oder nicht?
                    Wenn du schon so genau sein willst, dann richtig: PHP_INT_MAX x 2 +2

                    PHP-Code:
                    var_dump(array(PHP_INT_MAX*2+1=>1)); 
                    ergibt
                    Code:
                    array(1) {
                      [-1]=>
                      int(1)
                    }
                    Wie kommst du auf -1? PHP_INT_MAX * 2 = 2147483647 * 2 = 4294967294. Das kann man mit 32 Bit nicht mehr darstellen. PHP quetsch rein was geht, also 32 gesetzte Bit, was -2147483648 entspricht. Der Key in deinem Array müßte also -2147483648 sein und nicht -1.

                    Interessanterweise kann man Zahlen (zumindest Ints) jenseits des Wertebereichs ausgeben: echo 4294967294; und echo -4294967294; funktioniert wunderbar. Vermutlich werden alle Literale nach echo gleich als String behandelt. Als Array-Keys funktionieren nur die Zahlen von -(PHP_INT_MAX+1) bis PHP_INT_MAX. Jenseits davon ist alles -(PHP_INT_MAX+1).

                    EDIT:
                    Hab nachgesehen. Der Parser erkennt jede ganze Zahl außerhalb des Wertebereichs von Int als Float. Allerdings kann man als Array-Keys nur Ints und Strings verwenden. Das brachte mich auf folgende Idee:
                    PHP-Code:
                    print_r(array((string)(PHP_INT_MAX*3) => 0)); 
                    Also gibt es tatsächlich überhaupt kein Limit. Man kann unendlich viele Elemente in ein Array packen.

                    Zuletzt geändert von onemorenerd; 18.11.2008, 00:04.

                    Kommentar


                    • #11
                      "Könnte" ja sein, das Erfahrene Programmierer auf der PHP Ebene mit den Jahren gemerkt haben, dass sich eine Array nicht wirklich für größere, 3 bis 4 stellige Datensatzanzahlen eignet o.ä.!
                      für eine Suchfunktion arbeite ich auch mit sehr großen arrays, die sind teilweise sehr groß und werden durch verschiedene Methoden im verarbeitungsprozess eingedampft aber das stellte weder ein Geschwindigkeits- noch sonst ein Problem dar.....

                      und bevor irgendwelche Kommentare kommen, ja die Suchfunktion muss so
                      große Ergbnismengen bringen, da es sich um sehr viele Ergebnisse handeln kann....

                      Zuletzt geändert von martin2; 18.11.2008, 00:08.
                      <?php echo "ad astra"; ?>
                      www.utopiafuture.de

                      Kommentar


                      • #12
                        Ich denke auch, dass weniger die Menge der Elemente, als vielmehr die größe ausschlaggebend ist. Ein Array mit tausenden kleinen Elementen mit nicht mehr als 2 oder 3 Zeichen ist natürlich immer noch schnell und handlich, wenn man als Gegenbeispiel versucht die Frames einer 600MB-Videodatei in einem Array vorzuhalten.

                        Infosern. Ich sehe auch keine Alternative. Jedenfalls aus PHP-Sicht. Je nach dem was man macht, kann evtl. Überlegen, ob das auslagern in eine Datenbank nicht evtl. schlauer ist.
                        [FONT="Helvetica"]twitter.com/unset[/FONT]

                        Shitstorm Podcast – Wöchentliches Auskotzen

                        Kommentar


                        • #13
                          Wie kommst du auf -1? PHP_INT_MAX * 2 = 2147483647 * 2 = 4294967294. Das kann man mit 32 Bit nicht mehr darstellen. PHP quetsch rein was geht, also 32 gesetzte Bit, was -2147483648 entspricht. Der Key in deinem Array müßte also -2147483648 sein und nicht -1.
                          Dachte ich mir auch erst, aber probier es mal aus. Bei mir bekomme ich exakt diese Ausgabe mit -1. Wenn ich +2 verwende, bin ich wieder bei 0. Und -2147483648 bekommst du bei PHP_INT_MAX+1. Ist ja auch klar, weil nach diesem MAX-Wert ja der Integerüberlauf stattfindet. Bei 2*MAX+2 bist du dann einmal durch alle möglichen Werte wieder vorne im Wertebereich angelangt.

                          Also gibt es tatsächlich überhaupt kein Limit. Man kann unendlich viele Elemente in ein Array packen.
                          Da sind dann physikalische Speichergrenzen eher am Ende ^^

                          Kommentar


                          • #14
                            Original geschrieben von PHP-Desaster
                            Dachte ich mir auch erst, aber probier es mal aus. Bei mir bekomme ich exakt diese Ausgabe mit -1.
                            Habs ausprobiert. Ich bekomme -2147483648. Der Überlauf in PHP (5.2.1) scheint so zu sein, dass alles was jenseits des Wertebereichs liegt, -2147483648 ergibt.

                            Kommentar


                            • #15
                              Habs ausprobiert. Ich bekomme -2147483648. Der Überlauf in PHP (5.2.1) scheint so zu sein, dass alles was jenseits des Wertebereichs liegt, -2147483648 ergibt.
                              Hast du direkt mein Beispiel mit dem Wert als Arrayindex verwendet? Denn wenn ich mir die INTMAX*2 direkt ausgeben lasse, bekomme ich auch dein Ergebnis. Ich bin gerade nicht zu Hause und schaue nachher mal nach, mit welcher PHP-Version ich getestet habe. Wundert mich ja schon, wenn die Ergebnisse so unterschiedlich sein sollten.

                              Kommentar

                              Lädt...
                              X