php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 17-11-2008, 15:05
phpMorpheus2
 Registrierter Benutzer
Links : Onlinestatus : phpMorpheus2 ist offline
Registriert seit: Apr 2007
Beiträge: 646
Blog-Einträge: 2
phpMorpheus2 ist zur Zeit noch ein unbeschriebenes Blatt
Standard 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?
Mit Zitat antworten
  #2 (permalink)  
Alt 17-11-2008, 15:12
martin2
 Registrierter Benutzer
Links : Onlinestatus : martin2 ist offline
Registriert seit: May 2005
Ort: Duisburg
Beiträge: 79
martin2 ist zur Zeit noch ein unbeschriebenes Blatt
martin2 eine Nachricht über Skype™ schicken
Standard

warum nicht?

nein ernsthaft sollte kein Problem darstellen.....
__________________
<?php echo "ad astra"; ?>
www.utopiafuture.de
Mit Zitat antworten
  #3 (permalink)  
Alt 17-11-2008, 15:14
phpMorpheus2
 Registrierter Benutzer
Links : Onlinestatus : phpMorpheus2 ist offline
Registriert seit: Apr 2007
Beiträge: 646
Blog-Einträge: 2
phpMorpheus2 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
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.ä.!
Mit Zitat antworten
  #4 (permalink)  
Alt 17-11-2008, 15:32
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

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
Mit Zitat antworten
  #5 (permalink)  
Alt 17-11-2008, 15:55
phpMorpheus2
 Registrierter Benutzer
Links : Onlinestatus : phpMorpheus2 ist offline
Registriert seit: Apr 2007
Beiträge: 646
Blog-Einträge: 2
phpMorpheus2 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
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.
Mit Zitat antworten
  #6 (permalink)  
Alt 17-11-2008, 16:56
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

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.
Mit Zitat antworten
  #7 (permalink)  
Alt 17-11-2008, 17:02
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.578
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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.
Mit Zitat antworten
  #8 (permalink)  
Alt 17-11-2008, 17:11
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

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.
Mit Zitat antworten
  #9 (permalink)  
Alt 17-11-2008, 22:26
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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)
}
Mit Zitat antworten
  #10 (permalink)  
Alt 17-11-2008, 23:42
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Zitat:
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

Zitat:
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.


Geändert von onemorenerd (18-11-2008 um 00:04 Uhr)
Mit Zitat antworten
  #11 (permalink)  
Alt 17-11-2008, 23:53
martin2
 Registrierter Benutzer
Links : Onlinestatus : martin2 ist offline
Registriert seit: May 2005
Ort: Duisburg
Beiträge: 79
martin2 ist zur Zeit noch ein unbeschriebenes Blatt
martin2 eine Nachricht über Skype™ schicken
Standard

Zitat:
"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....

__________________
<?php echo "ad astra"; ?>
www.utopiafuture.de

Geändert von martin2 (18-11-2008 um 00:08 Uhr)
Mit Zitat antworten
  #12 (permalink)  
Alt 18-11-2008, 00:31
unset
  Moderator
Links : Onlinestatus : unset ist offline
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.782
unset befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #13 (permalink)  
Alt 18-11-2008, 01:57
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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.

Zitat:
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 ^^
Mit Zitat antworten
  #14 (permalink)  
Alt 18-11-2008, 02:38
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Zitat:
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.
Mit Zitat antworten
  #15 (permalink)  
Alt 18-11-2008, 09:26
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 05:05 Uhr.