PHP Ausführung über Console beschleunigen
rekneh
- php
Hallo,
ich habe ein kleines PHP Script geschrieben welches mir auf 16 Zeichen länge jegliche Kombination in ein Array schreibt:
$erlaubte_zeichen = array(" ","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","ä","ö","ü","ß");
$zusatz_array = array();
foreach($erlaubte_zeichen AS $buchstabe1) {
foreach($erlaubte_zeichen AS $buchstabe2) {
foreach($erlaubte_zeichen AS $buchstabe3) {
foreach($erlaubte_zeichen AS $buchstabe4) {
foreach($erlaubte_zeichen AS $buchstabe5) {
foreach($erlaubte_zeichen AS $buchstabe6) {
foreach($erlaubte_zeichen AS $buchstabe7) {
foreach($erlaubte_zeichen AS $buchstabe8) {
foreach($erlaubte_zeichen AS $buchstabe9) {
foreach($erlaubte_zeichen AS $buchstabe10) {
foreach($erlaubte_zeichen AS $buchstabe11) {
foreach($erlaubte_zeichen AS $buchstabe12) {
foreach($erlaubte_zeichen AS $buchstabe13) {
foreach($erlaubte_zeichen AS $buchstabe14) {
foreach($erlaubte_zeichen AS $buchstabe15) {
foreach($erlaubte_zeichen AS $buchstabe16) {
$data = trim($buchstabe1.$buchstabe2.$buchstabe3.$buchstabe4.$buchstabe5.$buchstabe6.$buchstabe7.$buchstabe8.$buchstabe9.$buchstabe10.$buchstabe11.$buchstabe12.$buchstabe13.$buchstabe14.$buchstabe15.$buchstabe16);
$zusatz_array[]=$data;
echo $data."\r\n";
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
Das es wirklich ettliche Stunden/Tage laufen muss um alle Inhalte zu generieren machte ich mich auf die Suche nach optimierungen. Idee
Aber weder CPU (AMD 1920X) noch RAM (32 GB) noch Datenträger (M2 SSD) haben irgendwelche Auslastungszeichen.
Da muss doch mehr gehen?!
@@rekneh
ich habe ein kleines PHP Script geschrieben welches mir auf 16 Zeichen länge jegliche Kombination in ein Array schreibt
Bei einem Zeichenvorrat von 30 Zeichen sind das 30¹⁶ ≈ 4.3 · 10²³ Kombinationen. In Worten: vierhundertdreißig Trilliarden. (Auf Englisch wären’s 430 sextillion.)
Was zum Geier willst du mit einem solchen riesigen Array anstellen?
Und wo zum Geier willst du das ablegen?
Bei einem Byte pro Zeichen, also 16 Bytes pro Arrayelement, wäre das ein Speicherplatzbedarf von 6.88 · 10²⁴ Bytes. Das sind 6.88 · 10¹² Terabyte. In Worten: schlappe sieben Billionen Terabyte. Hast du die im Schrank?
Da muss doch mehr gehen?!
Was immer du tust: Da muss doch weniger gehen‽
LLAP 🖖
Aber weder CPU (AMD 1920X) noch RAM (32 GB) noch Datenträger (M2 SSD) haben irgendwelche Auslastungszeichen.
Das kann man so nicht behaupten:
Das durch echo
erfolgende, oft widerholte Öffnen eines Ausgabepuffers ist eine 'teure' Operation, die insbesondere mit Wartezeiten verknüpft ist.
Also alle Ausgaben sammeln und auf einmal ausgeben:
Erste Zeile:
<?php
ob_start();
Für die Lauzeitmessungen hab ich Dein Skript mal gehörig verkürzt (Nur 4 verschachtelte Schleifen):
Mit ob_start:
real 0m2,174s
user 0m0,395s
sys 0m0,526s
Ohne ob_start:
real 0m4,037s
user 0m0,733s
sys 0m2,188s
Vergleiche insbesondere die Zeiten hinter sys
Warum Du für die Speicherung Google, Microsoft, Cloudflare, Amazon und Alibaba um Hilfe bitten (und ein paar Technologiesprünge abwarten) musst hat Gunnar beschrieben.
Die Aufgabenstellung ist offenkundiger Unfug. Ein denkbarer Zweck wäre ein brute-force Angriff auf Passworte, aber das funktioniert so einfach eh nicht.
Zwei Möglichkeiten: Der Fragesteller ist unerfahren oder ein Troll.
Der Name des Fragestellers ist strrev("henker")
.
Ich rieche einen Troll.
/close thread, no archive/
Rolf
Hallo rekneh,
ich bitte um Entschuldigung für die schnelle Schließung. Und danke an Gunnar für die Reaktion.
Um alle Falsch-Schreibungen eines Wortes zu finden, ist ein brute-force Ansatz nach meiner Meinung nicht hilfreich. Um eine "meinten Sie"-Unterstützung zu bauen, muss man anders vorgehen. Man braucht ein Wort und muss dann in einem Referenzwörterbuch nach Begriffen suchen, die diesem Wort "ähnlich" sind. Dazu ist eine Wortdistanz-Logik erforderlich. Sowas ist sprachspezifisch und auch nicht einfach zu programmieren.
Wichtiges Werkzeug ist hier zum einen die Levenshtein-Distanz, die zwischen dem eingegebenen Wort und dem Begriff im Wörterbuch zu bestimmen ist. Das ist aber nicht performant für alle Wörterbucheinträge machbar. Eine Vorab-Auswahl der Kandidaten könnte der Soundex Algorithmus liefern. Und natürlich fängst Du nur an zu suchen, wenn das eingegebene Wort nicht als "korrekt" im Wörterbuch steht. Was natürlich nicht wasserdicht ist; wenn im Wörterbuch "Seite" drinsteht und Du "Seite" tippst, aber die Gitarren-Saite meinst, dann hilft alles nichts.
Und wenn dein System dann herausgefunden hat, dass "Fohrumm" eine Falschschreibung von "Forum" ist, dann kann man DAS auch als "bekannte Falschschreibung" speichern und so das Gesamtsystem beschleunigen. Ich nehme an, dass Google genau so was macht. Und wenn "Seite" als Falschschreibung von "Saite" in dieser Liste steht, dann könnte sogar bei Eingabe von "Seite" ein Popup "meinten Sie vielleicht..." kommen.
Rolf
Hallo Rolf,
vielen Dank für die Analyse. Google hatte eine Publikation in den 90zigern in welcher das Problem legastenie mal Besprochen worden ist. Ich finde Sie leider nicht wieder und versuche es mal wiederzugeben. Der Lösungsansazt war folgender
Ich habe mir gedacht, wenn ich einen Index [falsch - richtig] hätte, könnte ich daraus einen Trainingsdatensatz für eine PhytonKI basteln. Er (der Trainingsdatensatz) müsste halt nur groß genug sein…
rekneh
wenn ich einen Index [falsch - richtig] hätte,
Gewichteten Index. Ich vermute mal, dass Google in irgendeiner Weise mitzählt, was nach der Eingabe ausgewählt wurde, und eine Wichtung vornimmt.
Merksatz:
„Längst nicht alles, was nach künstlicher Intelligenz aussieht, ist in Wirklichkeit keine Statistik.“