Wie kann man viele Datenmengen iin php am besten verarbeiten?

TribunM

Erfahrenes Mitglied
Hallöle

Also ich habe einen kleinen csv uploader gebastelt der eine dvd datenbank verarbeiten kann. Die Ergebnisse werden verarbeitet und in die Session vom user gespeichert. Das geht alles wunderbar. So jetzt habe ich mir mal gedacht was passiert, wenn die csv datei z.b. 500 Datensätze hat. Dann klappt php ein. Ich kann natürlich jetzt den Speicher erhöhen oder evtl doch meine Strategie ändern.

Da die Gechichte auf mehrere Seiten aufgeteilt ist, speichere ich den Datenarray in der Session zwischen. Ist es vielleicht besser die Daten in eine memorytabelle zwischenzuspeichern und dann immer wieder auszulesen? Um mit den Daten aber arbeiten zu können muss das ganze wiederum eh in einem Array gewandelt und dann verarbeitet werden. Das kostet auch wieder Performance.

Bsp. ein Array kann so aussehen

PHP:
ID
Titel
Genre
Länge
etc.

Das ganze dann ca. 500 mal was per for durchgearbeitet wird.

Mir geht es nur darum ob der Speicher so oder so erhöht werden muss (Momentan bei 128 MB, was nicht so sonderlich viel ist glaube ich) oder ob es bessere Techniken dafür gibt, um große Multiarrays über mehere Seiten zu verarbeiten.

Bin für jeden Vorschlag offen.

Joa da bin ich mal auf eure Ideen gespannt.
 
Zuletzt bearbeitet:
Ähhmm mal so ne blöde Frage warum willst du beim User soviele Daten in die Session schreiben? Oder reden wir über den Import in eine mysql?
 
Weil mir das zu mühselig ist alles per Post zu übertragen und wieder auszulesen. Ich glaube auch nciht, dass dies Performancerechnisch so ein riesen Unterschied ist. Aber ich lasse mich gerne eines besseren belehren.

Als vorgeschlagene Alternative wäre ja noch die Memorytabelle. Dann muss ich die aber bei jedem Schritt auch wieder extra auslesen, den Array jeweils wieder neu erstellen etc. Ich weiß auch nicht ob das schneller/besser ist.

Und da ich mich immer für die Erfahrung Anderer interessiere und gerne dazu lerne, stelle ich das mal zur DIskussion, wie man das am besten handhaben kann.
 
Ich glaube nicht, dass er bei 500 Einträgen bereits einklappt.

Anstelle der for-Schleifen empfehle ich dir speziefische array-Funktionen zu nehmen. array_map(), array_filter(), array_walk() etc.
 
Ich verstehe ja immernoch nicht genau was du vor hast. Du hast eine csv Datei mit DVDs. Diese sollen dann asugelesen und dem User angezeigt werden oder was soll damit passieren?
 
Ja genau die User können eine csv hochladen mit ihren DVDs. Aufbau siehe oben. Man kann auch einzelne DVDs hinzufügen, aber das ist eben bei vielen DVDs > 100 sehr mühselig. Da das ganze in drei Schritten aufgebaut ist 1. CSV Hochladen 2. Cover hochladen 3. Daten abgleichen und in Datenbank eintragen.

Um z.b. die Cover den Titeln aus der csv zuzuweisen müssen die Ergebnisse z.b. aus 1 Zwischengespeichert werden bis zu Schritt 3. Das mache ich halt per Session. Andere Möglichkeit wäre eben noch per Memory Tabelle. Mich interessiert ob das Performancemäßig egal ist, wenn die Session 2,3 arrays mit sagen wir mal je 500 Einträgen hat oder ob ich die Daten in eine Memorytabelle zwischenspeichere und in jedem Schritt neu auslese und diese Arrays wiederum neu erstelle.

Was sind denn so eure Erfahrungen?

@ yaslaw

Ich habe jetzt mehrmals gelesen, dass man gerade bei vielen Datenstzen eher for Schleifen nimmt als die php spezifischen array Funktionen. Diese sind z.t. bei großen Datenmengen entschieden langsamer. Außer array_flip das nutze ich z.t. auch.
 
Zuletzt bearbeitet:
*Klug******mode-on*

Ich habe jetzt mehrmals gelesen, dass man gerade bei vielen Datenstzen eher for Schleifen nimmt als die php spezifischen array Funktionen. Diese sind z.t. bei großen Datenmengen entschieden langsamer.

Und das hat sogar einen Grund: Stack-Wechsel kostet, bei einer (for-)Schleife wird der der Stack-Pointer nicht gewechselt. Innerhalb der array_*-Funktion wird dann natürlich auch wieder geloopt. Man spart sich also den Wechsel in die Funktion (und den __asm__('ret')).

*Klug******mode-off*
 
Jo also die For Schleifen sind ok. Also ich habe es mal mit Memorytabellen versucht und dann die Datenarrays neu aufgebaut. Performance ist gleich 0. Im Gegenteil, da hier die Arrays nochmal gebaut und wiederum Schleifen durchgegangen werden müssen, ist es z.T. sogar langsamer und verbaucht mehr Speicher.

Hm dann ist die Lösung mit Session gar nicht so schlecht, glaube ich.
 
Hm das Problem ist doch noch nicht wirklich gelöst. Wenn ich mehrere tausend Datensätze habe geht gar nix mehr. Also das Problem beibt bestehen.

Ich suche also immer noch nach einer Möglichkeit um mehrere Merhdimensionale Arrays mit vielen Datensätzen >1000 in 2,3 Schritten zu bearbeiten.

Probiert habe ich bisher.

Session: Ergebnis System klappt bei zu vielen Daten ein (Browser hängt) -> nicht brauchbar
Zwischentabellen: Klappt aber dann muss ich den array jedes Mal neu erstellen, würde ich aber dann evtl. doch machen müssen, wenn es wirklich keine andere gute Lösung gibt. Auch wenn die Performance dann nicht wirklich prall ist.

Welche Möglichkeiten seht ihr noch das Thema anzugehen?

Über Tipps und Lösungsansätze freue ich mich natürlich.

Tribbi
 
Du könntest ja die Anzahl der Lines in der CSV zählen. Dann z.B. Modulo 100 drauf machen. Dann hast du die Anzahl der Durchläufe, die benötigt werden, um die Datei aufgesplittet einzulesen. Das wäre der erste Schritt.

Nun öffnest du die Datei neu, dann läufst du über die Lines bis du 100 erreicht hast und merkst dir den File-Offset. Die eingelesenen 100 Lines kannst du jetzt verarbeiten, was auch immer damit noch gemacht werden muss.

Dann kommt der nächste Durchlauf der nächsten 100 Lines. Datei neu öffnen, ans File-Offset springen. Wieder 100 Lines lesen und das ganze so lange, bis die Anzahl der Modulo+1 erreicht ist.

Könnte evtl. etwas Performance bringen. Habs nicht probiert.

Im übrigen denke ich, das du eher ein Problem beim Speichern in die DB hast. Wieviele Indizes hat die Tabelle, die die Datensätze aufnehmen soll?
 
Zurück