Wie kann man viele Datenmengen iin php am besten verarbeiten?

Hi Saftmeister,

Im Moment habe ich zwei Baustellen.
1. Auslesen der csv und bauen der arrays
2. Übertragen der arrays in den nächsten Schritt (andere php. datei)

Für das erste Problem wollte ich die Geschichte mit einem Ajax call verbinden und könnte dann die Datei schrittweise auslesen. Ich nutze fgetcsv() da kann ich ja die Länge angeben aber das mit den Start und Ende bzw. der Position verstehe ich nicht ganz, wie du das jetzt meinst. Wie kann ich das jetzt festlegen?

Welche Frage ich mir schon die ganze Zeit stelle. Ist mysql so viel schneller als php? Also entweder ich baue einen Array und speichere dann direkt in die Tabelle oder ich baue eine temporäre Tabelle und übertrage das dann in die "richtige" Tabelle.

Wenn ich das in mysql only löse muss ich spätestens im zweiten Schritt den array zum verarbeiten neu erstellen. Hmmmm leider habe ich da noch keine Erfahrungswerte ob das vom Vorteil ist oder nicht.

Aber das mit den in der Session zwischenspeichern klappt ja leider nicht, da stürzt der Browser irgendwie immer bei zu vielen Arrays und Datensätzen ab. Ein Teufelskreis :rolleyes:
 
Ich nutze fgetcsv() da kann ich ja die Länge angeben aber das mit den Start und Ende bzw. der Position verstehe ich nicht ganz, wie du das jetzt meinst. Wie kann ich das jetzt festlegen?

fseek() ist dein Freund:

PHP:
$fd = fopen( "somefile.ext", "r" );
if( $fd )
{
  fseek( $fd, 0, SEEK_END ); // Setze Lese-Cursor ans Ende der Datei
  $endOffset = fseek( $fd, 0, SEEK_CUR ); // Aktuelles Offset auslesen

  fclose( $fd );
}

Welche Frage ich mir schon die ganze Zeit stelle. Ist mysql so viel schneller als php? Also entweder ich baue einen Array und speichere dann direkt in die Tabelle oder ich baue eine temporäre Tabelle und übertrage das dann in die "richtige" Tabelle.

Das kann man nicht mit Ja oder Nein beantworten, denn es hängt von mehreren Faktoren ab.

- Läuft die DB auf dem gleichen Host wie der Webserver, hat sie die gleichen Resourcen zur Verfügung wie der Webserver.
- Welche Operationen sollen auf die Daten angewendet werden? => Im Falle einer Suche und Sortierung der Datenmenge dürfte eine DB besser als PHP, allein durch die Tatsache, das PHP keine Indizes kennt.

Wenn ich das in mysql only löse muss ich spätestens im zweiten Schritt den array zum verarbeiten neu erstellen. Hmmmm leider habe ich da noch keine Erfahrungswerte ob das vom Vorteil ist oder nicht.

Aber das mit den in der Session zwischenspeichern klappt ja leider nicht, da stürzt der Browser irgendwie immer bei zu vielen Arrays und Datensätzen ab. Ein Teufelskreis :rolleyes:

Meiner Meinung nach kann das nur durch ausprobieren herausgefunden werden, da ich
- weder deine Algorythmen kenne, die auf die Daten angewendet werden
- und keine Kenntnis über die Datenbank-Struktur habe.

Ich wieder hole es noch mal:

Wenn du in der Ziel-Tabelle sehr viele Indizes hast, z.B. einen Fulltext oder ähnliches, kann das Einfügen der Daten auch sehr lange dauern, abhängig davon, wieviel da reingepumpt werden soll.

Sind die Einfüge-Operationen eigentlich Transaktionsgesteuert oder wird Auto-Commit verwendet? Hast du schon über Prepared Statements nachgedacht?
 
Ne das Einfügen der Daten allgemein ist eigentlich sehr schnell. Die Spalten durchgehen und die Arrays erstellen das kostet am meisten Zeit, weil ich ja die Daten nicht sofort in die Tabelle schreibe. Die Zieltabelle hat bis auf einen primary key und einen Fulltext auf den title keine indizes.

Die Operation fseek kannte ich bisher noch nicht. Aber interessant werde ich jetzt mal ausprobieren.

Also von der Theorie hatte ich mir das jetzt so gedacht. Ich verarbeite sagen wir mal immer 100 Datensätze merke mir die Position, sende einen ajax call, übergebe wiederum die Position und fahre mittels fseek(), sofern ich das richtig aufgefasst habe fort usw. bis ich am Ende angekommen bin. Das hört sich ansich ganz gut an.

Als weitere Alternative habe ich dann noch LOAD DATA INFILE über mySQL aber dann muss ich alles umbauen und das ist echt viel Arbeit bei den ganzen Abfragen und würde ich gerne vermeiden ^^, deshalb dieser Versuch.

Allgemein werde ich wohl nicht drumherum kommen allesmögliche mal auszuprobieren. Wenn das mit fseek gut klappt habe ich ja schon eine gute Möglichkeit den Prozess nach und nach auszuführen, um Abstürze oder ein Hängenbleiben des Browsers zu verhindern.

Danke bis hierhin schon einmal für die Anregungen. Für weitere Ideen und Tipps bin ich natürlich immer offen.

Greetz Tribbi
 
Nun, wenn du schon gemessen hast, und genau weißt, warum es zwickt, dann verwende doch die MySQL-Lösung. Wenn du noch mitteilst, warum du Arrays brauchst, was du damit machst, dann könnte man vielleicht nach einer Lösung suchen, wie man den Hoch-Sprachen-Teil in SQL gießt.
 
Hallo Saftmeister,

Die Arrays brauche ich um die Daten im zweiten Schritt zu verarbeiten. Momentan ist es so, dass ich einen Array mit allen Informationen erstelle und einen mit Mediendaten Cover usw. und einen mit den Operationen, also soll gelöscht werden, upgedatet werden usw.

Die speichere ich jeweils in die Session so dass sie die nächsten Schritte verfügbar sind, was anscheinend eine weniger glückliche Lösung ist, wenn die arrays z.B. aus je mehr als 1000 Stellen bestehen. Im letzten Schritt werden die Arrays dann wieder aus der Session gelöscht.

Das eine Problem geht also mit dem anderen einher. Wenn ich alles mit SQL löse muss ich jeweils die arrays in den betroffenen Schritten neu erstellen, um mit den Daten arbeiten zu können.

Auf cookies wollte ich nicht zurückgreifen, deshalb hatte ich eben bisher die Session Lösung verwendet, die nur bei zu vielen Daten einklappt.
 
Die Bearbeitung als Zwischenschritt ist in diesem Fall ziemlich unglücklich. Schreib die Daten doch gleich in die DB als neu getaggt. Dann biete eine View, mit der die Daten bearbeiten werden können - notfalls durchsuchbar. Solange die Daten noch bearbeitet werden sollen, bleibt das Neu getaggt. Erst wenn du mit dem jeweiligen Datensatz fertig bist, wird das Neu zu einem "Anzeigen" oder dergleichen.

Dann kann es für alle public angezeigt werden. Bei "Neu" werden die Datensätze halt nicht angezeigt. Das ist in meinen Augen die bessere Alternative.
 
Hm das würde aber bedeuten, dass ich den bisherigen Ablauf komplett umstellen muss. Das ist zu viel Umbauarbeit, denke ich.

Den ersten Schritt mit den Daten auslesen das klappt jetzt soweit. Jetzt bin ich dabei das Problem mit den Daten in die Datenbank zu schreiben, zu lösen.

Ich bin gerade dabei die Verarbeitung asynchron per Ajax zu lösen. Habe aber noch zu wenig mit jquery.post & json gearbeitet. Denke aber, dass es genau das ist, was ich hierfür benötige. Er soll pro Call z.B. zehn Datensätze oder so (muss ich noch testen wie viel sinnvoll ist) in die Datenbank schreiben, überprüfen ob alles ok ist und dann fortfahren.

Mal schauen, habe so ein paar Codebeispiele gefunden, die die Grundzüge der Funktion erklären. Wenn er ein Beispiel, basierend auf meine Beschreibung hat, wäre natürlich super.

// EDIT

Also mit Ajax das abzuarbeiten ist mal total unsinnig ^^. Das Problem ist nämlich, dass ich den Hauptarray bei jedem Call immer wieder mitübertragen muss, was bei einem array mit 1000 Stellen selbst mit json nicht wirklich performant ist. Also arbeite ich die csv jetzt doch in Stücken ab und schreibe in eine temporäre Tabelle. Mal schauen, wie toll diese Lösung ist.
 
Zuletzt bearbeitet:
Zurück