{"id":10728,"date":"2021-06-23T13:37:33","date_gmt":"2021-06-23T11:37:33","guid":{"rendered":"http:\/\/www.soeren-in-norwegen.net\/blog\/?p=10728"},"modified":"2021-02-08T16:34:21","modified_gmt":"2021-02-08T14:34:21","slug":"kevin-bacon-iii-irrelevante-information-c-keine-umleitungen","status":"publish","type":"post","link":"http:\/\/www.soeren-in-norwegen.net\/blog\/2021\/06\/kevin-bacon-iii-irrelevante-information-c-keine-umleitungen\/","title":{"rendered":"Kevin Bacon &#8211; III &#8211; irrelevante Information (c) &#8211; keine Umleitungen"},"content":{"rendered":"<p>Die letzten Beitraege in dieser Reihe und die folgenden waren\/werden relativ technisch und gingen\/gehen sehr ins Detail. Normalerweise wuerde ich nicht so sehr ins Detail gehen, wie ich die Daten fuer eine Analyse aufbereite und hantiere. Dieses Mal ist das anders, weil daran die Durchfuehrbarkeit des kompletten Projekts haengt. Hinzu kommt, dass dies insgesamt ein sch\u00f8nes Beispiel ist, wie aus einer komplexen &#8222;das geht ueberhaupt nicht&#8220;-Problemstellung\u00a0 eine &#8222;das k\u00f8nnte tatsaechlich was werden&#8220;-L\u00f8sung wird.<br \/>\nAber der Reihe nach.<\/p>\n<p>Aus den Rohdaten ziehe ich (ohne Bearbeitung) ca. 21 Millionen Titel in denen ca. 328 Millionen Links vorkommen. Man kann sich das also leicht vorstellen, dass selbst ein moderner Computer ein bisschen Zeit braucht um fuer nur _eine_ Wikipediaseite das komplette Netzwerk zu erforschen.<br \/>\nFuer die Ueberlegungen wieviel Zeit das braucht, kann man leider nicht wirklich die Taktfrequenz des Prozessors nehmen. Denn die sagt nur aus, wie schnell der ein Bit &#8222;bearbeitet&#8220; (im uebertragenen Sinne). Eine menschliche Anweisung sind aber viele interne Anweisungen und ben\u00f8tigen viele Prozessorzyklen. Bspw. 1 + 1 = 2 ist im Prozessor: lies Inhalt an Speicherplatz A, lies Inhalt an Speicherplatz B, addiere die Werte, schreibe zu Speicherplatz C das Resultat, gib das ganze auf dem Schirm aus. Und DAS ist auch wieder nur eine vereinfachte Darstellung und besteht an und fuer sich wieder aus mehreren internen Schritten.<\/p>\n<p>Eine Ueberschlagsrechnung was zu erwarten ist, kann man dennoch durchfuehren und das ist mglw. deutlich anschaulicher als abstrakte Instruktionen im Prozessor.<br \/>\nDie Rohdaten beinhalten ca 1,2 Milliarden Zeilen mit Text. Die Verarbeitung einer Zeile beinhaltet (ganz grob) das Lesen der Zeile, die Verarbeitung der Information und Entscheidungen ob da Zeug drin ist was ich haben will oder nicht. Ein Durchgang durch die kompletten Rohdaten ben\u00f8tigt ca. 6000 Sekunden. Das bedeutet, dass das Pythonprogram ca. 200,000 Zeilen pro Sekunde verarbeiten kann.<br \/>\nAuch wenn die Erforschung des Linknetzwerks eine ganz andere Aufgabe ist, so ist der &#8222;Rechenaufwand&#8220; sicherlich aehnlich und der folgende Vergleich ist durchaus aussagekraeftig.<br \/>\nIch nehme also an, dass ich 200,000 Links pro Sekunde &#8222;verfolgen&#8220; kann. Mit den oben erwaehnten 328 Millionen Links bedeutet dies, dass die Erforschung des Linknetzwerks nur EINER Seite ca. 1600 Sekunden dauert. Bei 21 Millionen Wikipediaseiten sind das dann fast 1100 Jahren die die komplette Analyse braucht.<\/p>\n<p>Nun gebe ich zu, dass der Vergleich nicht ganz ok ist. Denn Input\/Output (vulgo: lesen und schreiben auf die Festplatte\/den Bildschirm) geh\u00f8ren zu den Sachen die am laengsten bei der Datenverarbeitung dauern. Dies illustriert im Uebrigen auch sehr sch\u00f8n, warum ich so darauf rumhacke, dass ich alles in den Arbeitsspeicher bekomme. Eben damit ich genau diesen &#8222;Flaschenhals&#8220; vermeiden kann.<br \/>\nNehmen wir also an, dass alles im Arbeitsspeicher ist und damit die Rechenzeit nur 1\/100 betraegt (was schon in der richtigen Gr\u00f8szenordnung liegt). Dann dauert die gesamte Analyse immer noch fast elf Jahre. Diese elf Jahre muss der Rechner durchgehend laufen.<br \/>\nNehmen wir nun weiter an, dass nur ein Viertel der Webseiten analysiert werden muss (ca. 6 Millionen) und insgesamt nur 200 Millionen Links darin verlinkt sind. Dann braucht die Analyse des Linknetzwerks einer Webseite nur 10 Sekunden (wenn alles im Arbeitsspeicher ist) und alles kann in zwei Jahren fertig sein.<\/p>\n<p>Zwei Jahre? DAS ist ein realistischer Zeitrahmen! Und wenn ich den Code optimiere und das auf mehreren Rechnern laufen lasse, dann brauche ich noch weniger Zeit.<\/p>\n<p>So, nun wisst ihr, meine lieben Leserinnen und Leser beide Hauptgruende warum mir so sehr am Verstaendnis der Daten liegt. Die Menge der zu verarbeitenden Daten entscheidet darueber ob das Projekt durchfuehrbar ist oder nicht. Und den ganzen irrelevanten Kram muss ich auch deswegen rausbekommen, damit mir das nicht die Ergebnisse verfaelscht (das erwaehnte ich beim letzten Mal).<\/p>\n<p>Die Erwaehnung irrelevanten Krams bringt mich nun endlich zu dem worueber ich eigentlich Schreiben wollte: Umleitungen \u2026 oder auf englisch: redirects.<\/p>\n<p>Umleitungen sind (beinahe) unsichtbar. Nehmen wir als Beispiel wieder <a href=\"https:\/\/en.wikipedia.org\/wiki\/Sprevane\" target=\"_blank\" rel=\"noopener\">Sprevane<\/a> vom letzten Mal. Das kann man in der Wikipediasuche auch mit einem &#8222;w&#8220; anstelle eines &#8222;v&#8220; schreiben. Man landet dennoch direkt bei der Seite die ich verlinkt habe. Wenn man auf diese Art und Weise dort hingelangt, dann sieht man zusaetzlich:<\/p>\n<p><a href=\"http:\/\/www.soeren-in-norwegen.net\/blog\/wp-content\/uploads\/Redirect.png\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-10739 size-full\" src=\"http:\/\/www.soeren-in-norwegen.net\/blog\/wp-content\/uploads\/Redirect.png\" alt=\"\" width=\"259\" height=\"87\" \/><\/a><\/p>\n<p>Drueckt man dort dann auf den Link, landet man <a href=\"https:\/\/en.wikipedia.org\/w\/index.php?title=Sprewane&amp;redirect=no\" target=\"_blank\" rel=\"noopener\">hier<\/a> \u2026<\/p>\n<p><a href=\"http:\/\/www.soeren-in-norwegen.net\/blog\/wp-content\/uploads\/Redirect_2.png\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-10740 size-full\" src=\"http:\/\/www.soeren-in-norwegen.net\/blog\/wp-content\/uploads\/Redirect_2.png\" alt=\"\" width=\"421\" height=\"215\" \/><\/a><\/p>\n<p>\u2026 und erfaehrt, warum man nicht dort sondern bei der Seite mit der anderen Schreibweise gelandet ist. Dies passiert alles intern und der Nutzer bekommt davon (fast) nix mit. Umleitungen sind somit nicht Teil des Weltwissens, wenn dieses denn (auf der Wikipedia) besprochen wird. Im Quellcode existieren diese natuerlich trotzdem, denn auch wenn das intern geschieht, so muss das ja doch irgendwo stehen, damit die Maschine weisz, was sie intern machen muss.<\/p>\n<p>Das ist aber gut, denn es bedeutet, dass ich alle Titel die eine Umleitung sind entfernen kann. Damit fallen dann auch alle Links weg die auf diesen Umleitungsseiten stehen.<br \/>\nEs ist aber natuerlich zu beachten, dass ich bei den verbleibenden Links dann auch alle Umleitungsseiten mit den richtigen &#8222;Zielen&#8220; ersetzen muss.<\/p>\n<p>Umleitungen sind im Quellcode auch leicht zu erkennen, denn diese haben eine spezielle Markierung. Gut wa! Da kann ich also die Umleitungen unabhaengig von den anderen Sachen einsammeln.<\/p>\n<p>Normalerweise gibt es auf der Umleitungsseite nur einen Link; den zur richtigen Seite. Manchmal steht da aber auch mehr. Nehmen wir als Beispiel <a href=\"https:\/\/en.wikipedia.org\/w\/index.php?title=Abdul_Alhazred&amp;redirect=no\" target=\"_blank\" rel=\"noopener\">Abdul Alhazred<\/a>. Dort gibt es (verstaendlicherweise) diese <a href=\"http:\/\/www.soeren-in-norwegen.net\/blog\/?p=10719\" target=\"_blank\" rel=\"noopener\">beim letzten Mal erwaehnten<\/a> Abschnitte nicht, welche als Markierung dienen um das Einsammeln von Daten am Ende einer Seite zu unterbinden.<br \/>\nDeswegen sammle ich die Links in der Box \u2026<\/p>\n<p><a href=\"http:\/\/www.soeren-in-norwegen.net\/blog\/wp-content\/uploads\/Redirect_3.png\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-10741 size-full\" src=\"http:\/\/www.soeren-in-norwegen.net\/blog\/wp-content\/uploads\/Redirect_3.png\" alt=\"\" width=\"651\" height=\"50\" \/><\/a><\/p>\n<p>\u2026 auch mit ein. Das war unerwartet aber gut, denn es machte mich auf eine andere Sache aufmerksam die ich nicht brauche: Categories \u2026 oder allgemeiner: interne Wikipediaseiten. Dazu aber mehr beim naechsten Mal.<\/p>\n<p>Insgesamt gibt es 9,385,391 Seiten in der Wikipedia die Umleitungen sind \u2026 o.O \u2026 das ist jetzt _deutlich_ mehr als ich erwartet habe. Das ist aber voll toll, denn dadurch reduziert sich die Anzahl der zu untersuchenden Wikipediaseiten auf 11,435,116 welche 267,204,162 Links beinhalten. Supergut!<br \/>\nAch ja, verfolgt man meine genauen Zahlenangaben, dann sieht man, dass ich 23 Seiten zu viel habe (unter der Annahme, dass ich alle Umleitungen l\u00f8sche). Das ist jetzt zwar doof, aber der Fehler ist so klein, dass ich das nicht weiter verfolgt habe. Die Wikipedia ist von Menschen gemacht und da erwarte ich (Schreib)Fehler.<\/p>\n<p>Die Gr\u00f8sze der Daten in Textform reduziert sich von 6.0 GB auf nur 5.6 GB und die Gr\u00f8sze der strukturierten Daten geht runter auf 8.2 GB (von vormals 8.9 GB).<\/p>\n<p>Waehrend ich mich darum kuemmerte, stolperte ich darueber, dass es im Quellcode Kommentare gibt und dass diese auch Links beinhalten k\u00f8nnen \u2026 *seufz* menschengemachte Daten *doppelseufz* \u2026<br \/>\nKommentare haben zum Glueck auch eine Markierung im Quelltext und somit ist es relativ einfach die herauszufiltern. Mit nur 1363 Links die deswegen wegfallen handelt es sich dabei aber (unerwarteterweise) um kein groszes Problem. Die Anzahl der Titel veraendert sich dadurch natuerlich nicht und bei nur so ein paar weniger Links aendert sich auch die Gr\u00f8sze der Daten nicht wirklich.<\/p>\n<p>Aber genug fuer heute. Beim naechsten Mal mehr :) .<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die letzten Beitraege in dieser Reihe und die folgenden waren\/werden relativ technisch und gingen\/gehen sehr ins Detail. Normalerweise wuerde ich nicht so sehr ins Detail gehen, wie ich die Daten fuer eine Analyse aufbereite und hantiere. Dieses Mal ist das anders, weil daran die Durchfuehrbarkeit des kompletten Projekts haengt. Hinzu kommt, dass dies insgesamt ein [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"http:\/\/www.soeren-in-norwegen.net\/blog\/wp-json\/wp\/v2\/posts\/10728"}],"collection":[{"href":"http:\/\/www.soeren-in-norwegen.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.soeren-in-norwegen.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.soeren-in-norwegen.net\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.soeren-in-norwegen.net\/blog\/wp-json\/wp\/v2\/comments?post=10728"}],"version-history":[{"count":3,"href":"http:\/\/www.soeren-in-norwegen.net\/blog\/wp-json\/wp\/v2\/posts\/10728\/revisions"}],"predecessor-version":[{"id":10743,"href":"http:\/\/www.soeren-in-norwegen.net\/blog\/wp-json\/wp\/v2\/posts\/10728\/revisions\/10743"}],"wp:attachment":[{"href":"http:\/\/www.soeren-in-norwegen.net\/blog\/wp-json\/wp\/v2\/media?parent=10728"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.soeren-in-norwegen.net\/blog\/wp-json\/wp\/v2\/categories?post=10728"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.soeren-in-norwegen.net\/blog\/wp-json\/wp\/v2\/tags?post=10728"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}