rekneh: PHP Ausführung über Console beschleunigen

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 1. Aktuelle PHP Version nutzen 2. Über die Windows Console Starten damit kein Timeout entsteht 3. Memmorylimit auf 25G angehoben 4. Über Windows Taskmanager auf "Echtzeit" umgestellt.

Aber weder CPU (AMD 1920X) noch RAM (32 GB) noch Datenträger (M2 SSD) haben irgendwelche Auslastungszeichen.

Da muss doch mehr gehen?!

  1. @@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 🖖

    -- „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
  2. 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.

  3. 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

    -- sumpsi - posui - clusi
  4. 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

    -- sumpsi - posui - clusi
    1. 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

      • Phase 1 alle Falschschreibweisen mitloggen
      • Phase 2 vermutliche zusammenhänge berechnen (Levenshtein könnte gut passen)
      • Phase 3 Ergebnis für Falschschreibweise ausliefern mit "meinten Sie" ausliefern und auf Klick warten
      • Phase 4 Wenn Klick erfolgt gabt es im Verhältnis zur anzahl an Suchen einen Zusammenhang.
      • Phase 5 Index zum vermutlich korrekten Wort anzeigen alternativ Unserangabe einblenden (alternativ suche nach...)
      • Phase 6 Wenn Klick erfolgt erneute Prüfung duch Phase 3.

      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

      1. 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.“