-
Hallo,
Ich habe derzeit ein Projekt am laufen, wo ich jede Nacht um 1:00 Uhr
Daten aus XML Files beziehe.
Im Moment sind knapp 5.000 Einträge vorhanden.
100 Einträge = 11 Sek.
1.000 Einträge = 110 Sek.
5.000 Einträge = 550 Sek.
550 % 60 = ~9 Minuten
Ausgenommen immer ein DB Update.
Also sagen wir mal, dass dauert 10 Minuten.
Wenn ich jetzt 50.000 Einträge hätte, würde das ganze 100 Minuten dauern.
Nun dachte ich mir, währe es doch theoretisch möglich 10 Files gleichzeitig zu beziehen,
würde das ganze um dem Faktor 10 beschleunigen.
Diese pcntl_fork Geschichte scheint wohl nicht das wahre zu sein,
da ich mir da wahrscheinlich schon ein eigenes Framework(zumindest eine umfangreiche Klasse) basteln müsste.
So nun meine Frage:
Hätte jemand eine Idee wie man dies schneller und effektiver lösen kann?Tutorials: Ajax JSON Chat PHP
-
Hi jannicars,
ich würde mal ganz schlicht sagen: PHP hat nicht wirklich Threading, und einfach so "herzaubern" kann man das auch nicht.
Sind die Aktionen kompliziert?
Ist die Beschleunigung (sehr) wichtig?
Du könntest auch einfach ein "normales" Programm, z.B. in C++ schreiben und dann aus PHP heraus aufrufen.
Gruß
-
30.01.12 16:56 #3
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.886
- Blog-Einträge
- 29
Hallo,
eine weitere einfache alternative... wenn die Import-Vorgänge alle unabhängig voneinander sind, dann starte doch einfach X PHP-Prozesse zur Verarbeitung deiner Dateien mit unterschiedlicher Parameterisierung (Prozess 1: Files 0-1000, Prozess 2: Files: 1001-2000, etc.).
Gruß TomJava rocks!
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
Hi javaDeveloper2011,
Die Beschleunigung des Scriptes ist sehr wichtig,
da dass Script mit 5.000 Einträgen knapp 1 Stunde braucht.
Es werden bestimmt bald locker sich um die 50.000 Einträge in der
Datenbank rumtummeln.
Das Problem an der anderen Sprache währe,
1. Ich kann keine andere Sprache.
2. Ich benutze ein Framework in PHP(bestimmt könnte es auch ohne gehen, wird dann aber wieder komplizierter.)
So umfangreich ist das ganze Script auch nicht:
1. Schritt-> Alle Einträge in eine Schleife packen
2. Schritt-> In der Schleife dann das File immer einzeln laden, Daten entnehmen,
ein MySQL Datenbank update (1 Eintrag editieren) und in eine andere Tabelle 1 Insert.
Schritt 2 Halt immmer in einer Schleife.
Darüber habe ich mir auch schonmal Gedanken gemacht.
Mein gedachter Weg dies zu realisieren:
1. Alle Einträge zählen und in 10-20 Prozesse aufteilen.
2. per Exec() die Datei aufrufen mit GET(?!) Parametern.
3. Den Rest halt da weiterlaufen lassen.
Klingt irgendwie ganz gut.Geändert von jannicars (30.01.12 um 17:05 Uhr)
Tutorials: Ajax JSON Chat PHP
-
30.01.12 17:20 #5
- Registriert seit
- Jul 2006
- Beiträge
- 518
Hey,
wie ist dein Import-Vorgang gelöst bzw. programmiert?
Vielleicht gibt es dort noch Potenzial ...
mfg
bo
-
30.01.12 17:20 #6Wie wäre es, wenn du zuerst alle SQL-Statements sammelst und sie dann gemeinsam auf einen Schlag ausführst?So umfangreich ist das ganze Script auch nicht:
1. Schritt-> Alle Einträge in eine Schleife packen
2. Schritt-> In der Schleife dann das File immer einzeln laden, Daten entnehmen,
ein MySQL Datenbank update (1 Eintrag editieren) und in eine andere Tabelle 1 Insert.
Schritt 2 Halt immmer in einer Schleife.
Rufe es lieber mit Parametern auf:2. per Exec() die Datei aufrufen mit GET(?!) Parametern.
Code :1
php -f /path/to/the/file.php firstparam secondparam
Und im PHP-Skript kannst du per $argv auf die Paramter zugreifen.mfg ComFreek
Falls ich dir geholfen habe, würde ich mich über ein DANKE freuen!
Kenn mich am besten aus in C++, WEB-Sprachen (PHP, HTML, JavaScript) und vllt. mehr
[PHP] Überprüfen, ob Website erreichbar • Sicherheit in PHP-Codes schaffen • Google Chrome-Extension für tutorials.de • json_compress()
-
Würde das so drastisch den ganzen Ablauf beschleunigen?
Aber dafür braucht das Script mehr RAM?
Ich hab früher auch schon versucht, Scripte per command line auszuführen, scheiterte immer beim includen von anderen Dateien.
Ich hab da glaub ich immer
benutzt.Code :1
php -c oder -x
Tutorials: Ajax JSON Chat PHP
-
30.01.12 18:45 #8Habe gerade schnell mal einen Test gemacht:Würde das so drastisch den ganzen Ablauf beschleunigen?
Aber dafür braucht das Script mehr RAM?
Tabelle:
Code sql:1
CREATE TABLE big_table ( id INTEGER AUTO_INCREMENT PRIMARY KEY, sometext CHAR(255) )
Es werden jeweils 1000 255 Zeichen lange Strings eingefügt:
1.) mysqli_query() bei jedem Durchlauf der Schleife (Zeitdifferenz in Mikrosekunden | RAM in Bytes):
2.) mysqli_query() außerhalb der Schleife mit 1000 INSERT VALUES-Kommandos:1.8684060573578 | 331760
Also, es lohnt sich auf jeden Fall. Wenn du dann noch ein mysqli_query()-Kommando nach jedem x. Hinzufügen von Werten einbaust, kannst du auch noch die RAM-Nutzung regulieren.0.075608015060425 | 592648
set_include_path() könnte dir helfen.Ich hab früher auch schon versucht, Scripte per command line auszuführen, scheiterte immer beim includen von anderen Dateien.mfg ComFreek
Falls ich dir geholfen habe, würde ich mich über ein DANKE freuen!
Kenn mich am besten aus in C++, WEB-Sprachen (PHP, HTML, JavaScript) und vllt. mehr
[PHP] Überprüfen, ob Website erreichbar • Sicherheit in PHP-Codes schaffen • Google Chrome-Extension für tutorials.de • json_compress()
-
Also einfach in der Schleife alles in ein Array packen,
am schluss das ganze Array in einer For Schleife mit Insert und Update machen in einem Rutsch?
Könntest du am besten mal das Testscript posten?
Tutorials: Ajax JSON Chat PHP
-
-
30.01.12 19:07 #11
Einfach per Kommata die einzelnen Werte-Blöcke (in Klammern) trennen.
Mein Test-Code war:
test1.php:
test2.php:PHP-Code:<?php
$connection = mysqli_connect('***','***','***','***') or die('ERROR');
$text = str_repeat('ABCDE', 51);
$limit = 1000;
$time1 = array(microtime(true));
for ( $i=0; $i<$limit; $i++ )
{
mysqli_query($connection, 'INSERT INTO big_table (sometext) VALUES (\''.$text.'\')') or die(mysqli_error($connection));
}
$time1[] = microtime(true);
echo $time1[1]-$time1[0] . '|' . memory_get_usage();
?>
PHP-Code:<?php
$connection = mysqli_connect('***','***','***','***') or die('ERROR');
$text = str_repeat('ABCDE', 51);
$limit = 1000;
$time2 = array(microtime(true));
$queries = 'INSERT INTO big_table (sometext) VALUES (\''.$text.'\')';
for ( $i=0; $i<$limit; $i++ )
{
$queries .= ',(\''.$text.'\')';
}
mysqli_query($connection, $queries) or die(mysqli_error($connection));
$time2[] = microtime(true);
echo $time2[1]-$time2[0] . '|' . memory_get_usage();
?>mfg ComFreek
Falls ich dir geholfen habe, würde ich mich über ein DANKE freuen!
Kenn mich am besten aus in C++, WEB-Sprachen (PHP, HTML, JavaScript) und vllt. mehr
[PHP] Überprüfen, ob Website erreichbar • Sicherheit in PHP-Codes schaffen • Google Chrome-Extension für tutorials.de • json_compress()
-
Danke!
Das werd ich auf jedenfall so umsetzen.
Werde auch noch gucken, ob ich das mit dem Aufteilen vernünftig realisiert bekomme.Tutorials: Ajax JSON Chat PHP
-
Die Sache mit dem Aufteilen:
20 PHP Prozesse sind doch für einen schnellen Server kein Problem, da dass ja nichts rechtenintensives ist, oder?
Auch wenn ich das wie obig beschrieben mache; erst alle sammeln dann Updaten; dürfte den MySQl Server nicht in die Knie ziehen oder?Tutorials: Ajax JSON Chat PHP
-
Sollte es nicht, nein...
Allerdings ist es eine gute Frage, ob es nicht gescheiter wäre 5 Mal je 4Prozesse laufen zu lassen, wenn du eh alle SQL-Querys auf einmal durchführst, indem du sie vorher sammelst. Das dürfte doch schneller gehen und spart Ressourcen. Probier einfach bisschen rum...
-
Dann hab ich ja diese Woche nie langeweile.. Danke
Tutorials: Ajax JSON Chat PHP
Ähnliche Themen
-
Multithreading
Von bspainkf36 im Forum JavaAntworten: 4Letzter Beitrag: 11.10.09, 17:00 -
Multithreading
Von Paranoia im Forum .NET Web und KommunikationAntworten: 1Letzter Beitrag: 24.06.08, 17:32 -
Multithreading
Von pria im Forum .NET Windows FormsAntworten: 10Letzter Beitrag: 09.11.07, 11:42 -
Multithreading
Von Kaladial im Forum JavaAntworten: 10Letzter Beitrag: 20.09.07, 13:40 -
[c++] multithreading
Von cyrrus im Forum C/C++Antworten: 6Letzter Beitrag: 01.11.02, 20:08



2Danke

Zitieren



Login





