Massenupdate/Schleife

Methos

Erfahrenes Mitglied
hab ein Problem bei einem Massenupdate. Ich muß täglich ca. 50000 Artikel updaten. Das Problem hierbei ist, das nach einer gewissen zeit das Skript abbricht. Ihm geht einfach der Speicher aus.
Was vermutlich daran liegt, das ich die Artikel mit einem Select komplett auslese und dann entsprechende updates fahre.

Würde es evtl. etwas bringen immer nur einen Aritkel auszulesen und das ganze in eine Schleife zu packen?

Über Ratschläge oder andere Ansatzweisen würd ich mich freuen.
 
Ich habe mal eine Art Newsletter geschrieben, wo auch ca. 1000 Mails raus gehen sollten. Um die 30 Sekunden Time-Out zu umgehen, habe ich das script immerwieder selbst aufrufen lassen und pro aufruf 10 mails (begrenzt durch Mailprovider) verschickt. Vielleicht machst du dann 1.000 UPDATE Befehle auf einmal? Müsstest du mal testen... Übergeben würde ich immer die Maximale Anzahl an Einträgen, wo du beginnst und wo du stoppst, bis zum nächsten durchlauf von 1.000 UPDATEs. Vielleicht hilft dir das etwas weiter.


Gruß Radhad
 
Naja ich hab mir das so gedacht.
Eine Spalte in der ich die Zeit eintrage beim update.
Beim nächsten Durchlauf fragt er alle Artikel ab die heute noch nicht abgefragt wurden.
Das ganze versehe ich mit einem Limit 0,1000.
Ich müsste das ganze dann nur noch in eine Schleife einbauen, die dann wieder von vorne beginnt und zwar solange, bis alle Artikel abgearbeitet wurden.

Klingt für mich gut aber die Umsetzung bereitet mir noch Kopfschmerzen.
 
Zuletzt bearbeitet:
Nein das ist leider nicht möglich.
Ich muß zuerst alle aritkel_ids abfragen, aus der artikel_id erstelle ich eine xml Abfrage.
Diese wird dann mit dem Inhalt der DB verglichen, ändert sich etwas, erfolgen die Updates.
 
So, das mit der Schleife hat leider auch nicht den gewünschten Erfolg gebracht. Das Skript ist nach wie vor so Speicherhungrig wie zuvor.
Also im moment fällt mir jetzt nichts mehr ein außer mehrere Cronjobs starten zu lassen.
Wobei hier natürlich dann das Problem ist, woher weiß ich, das der erste schon fertig ist usw. Eine saubere Lösung wäre das also auch nicht wirklich.

Könnte man evtl. das ganze mit einem perl Skript oder was ähnlichem lösen? Das also ständig im Hintergrund läuft und sobald das PHP Skript mit der Schleife fertig ist, das selbige nochmals anstösst und zwar solange bis alle updates durchgeführt wurden.

Über andere Lösungsvorschläge würde ich mich auch freuen
 
Hy, wieso klappt das nicht mit der Schleife? Der speicher, kann ja nicht genauso voll sein, als wenn du alle 50000 mitmal holst!

Weiß jetzt nicht genau, ob das nur zur laufzeit was bringt, aber versuch doch mal mittels mysql_free_result(//resulte_id) den speicher wieder frei zu machen!

PHP:
//timestamp heute 00:01 uhr bilden

$select = sprintf('SELECT ... WHERE time < %1$d LIMIT 0,1000', $timestamp_0000);
//MYSQL BLABLA

while() {
//ICH MACHE DIE UPDATES
}

mysql_free_result($result);
 
PHP:
mysql_free_result ($result);

Sobald die Abfrage beendet ist, wird die Zeile schon aufgerufen.
Bringt nur leider auch nicht wirklich etwas.
Vielleicht steigt der Speicher auch durch die XML Files an die ich zum Vergleichen ja zuerst mal ziehen muß.
 
Methos hat gesagt.:
PHP:
mysql_free_result ($result);

Sobald die Abfrage beendet ist, wird die Zeile schon aufgerufen.
Bringt nur leider auch nicht wirklich etwas.
Vielleicht steigt der Speicher auch durch die XML Files an die ich zum Vergleichen ja zuerst mal ziehen muß.

Magst uns mal den Teil mit den XML Files posten, vielleicht kann man dir ja denn eher helfen!
 
Zurück