{"id":11388,"date":"2022-01-19T13:37:01","date_gmt":"2022-01-19T11:37:01","guid":{"rendered":"http:\/\/www.soeren-in-norwegen.net\/blog\/?p=11388"},"modified":"2021-09-01T14:13:38","modified_gmt":"2021-09-01T12:13:38","slug":"kevin-bacon-xiv-alles-wird-zahl","status":"publish","type":"post","link":"http:\/\/www.soeren-in-norwegen.net\/blog\/2022\/01\/kevin-bacon-xiv-alles-wird-zahl\/","title":{"rendered":"Kevin Bacon &#8211; XIV &#8211; Alles wird Zahl"},"content":{"rendered":"<p>Endlich kann ich ueber diesen Geniestreich reden \u2026 aber ich greife vor.<\/p>\n<p>Beim vorletzten Mal &#8222;mathematisierte&#8220; ich das Kevin-Bacon-Problem. Das war prinzipiell l\u00f8sbar, aber ich stellte <a href=\"http:\/\/www.soeren-in-norwegen.net\/blog\/?p=11375\" target=\"_blank\" rel=\"noopener\">beim letzten Mal<\/a> fest, dass es aufgrund von Speicherplatzmangel technisch in der gegebenen Form praktisch nicht l\u00f8sbar war.<\/p>\n<p>Ich redete beim letzten Mal viel ueber die &#8222;Betriebskosten&#8220; (in Form von Speicher) die Datenobjekte haben. Dabei konzentrierte ich mich auf Wortobjekte. Fuer jedes Wort habe ich &#8222;Betriebskosten&#8220; von 49 Bytes plus der Speicherbedarf der &#8222;Nutzlast&#8220; von 1 Byte pro Buchstabe. Die &#8222;Nutzlast&#8220; ist von der Laenge des Wortes abhaengig.<\/p>\n<p>Ich erwaehnte auch, dass eine Zahl keine Laenge hat. Cool ist nun, dass der Gesamtspeicherbedarf (&#8222;Betriebskosten&#8220; + &#8222;Nutzlast&#8220;) einer ganzen Zahl auf meinem Rechner unter Python 3.7.3 deutlich kleiner ist als fuer W\u00f8rter; naemlich nur 28 Bytes. Und das ist unabhaengig davon, wie grosz die Zahl wird! \u2026 Naja, es gibt natuerlich Ausnahmen. Die Null braucht nur 24 Bytes und ganz grosze Zahlen (genauer gesagt ab 1,073,741,824) brauchen dann schon 32 Byte und irgendwann werden die Zahlen so grosz, dass die 36 Byte brauchen usw. Aber das ist hier nicht von Interesse, da ich nicht in diese groszen Bereiche komme mit dem gegebenen Problem.<\/p>\n<p>Und hier kommt jetzt die geniale Idee: Ich bildete jeden Titel auf eine nicht negative ganze Zahl (inklusive der Null) ab. Wenn ein Titel von einem anderen Titel zitiert wird, dann erstatte ich diesen mit der gegebenen Zahl. Die Reihenfolge spielt dabei ueberhaupt keine Rolle. Diese Abbildung ist <a href=\"https:\/\/de.wikipedia.org\/wiki\/Bijektive_Funktion\" target=\"_blank\" rel=\"noopener\">bijektiv<\/a> und die Abbildungsvorschrift (einfach eine lange Tabelle welcher Titel welcher Zahl zugeordnet ist) merke ich mir natuerlich, falls ich spaeter eine spezfische Linkkette nachverfolgen will.<\/p>\n<p>Durch die Abbildung auf nicht negative ganze Zahlen verringerte sich der Speicherbedarf meiner 5,798,312 Titel und 165,913,569 Links von ehedem 11 GB auf 4,807,932,668 als ca. 4.8 GB \u2026 Huzzah!<\/p>\n<p>Damit habe ich das Kevin-Bacon-Problem nicht nur mathematisiert, sondern auch &#8222;verzahlt&#8220;. Das coole ist, dass sich dabei der Informationsinhalt, bzgl. der Informationen, an denen ich interessiert war (!), nicht veraenderte. Cool wa!<\/p>\n<p>Zur Veranschaulichung hier das dritte Beispiel vom vorletzten Mal in der neuen Darstellung:<\/p>\n<p><a href=\"http:\/\/www.soeren-in-norwegen.net\/blog\/wp-content\/uploads\/38_network_exampe_as_ints.png\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-11400 size-medium\" src=\"http:\/\/www.soeren-in-norwegen.net\/blog\/wp-content\/uploads\/38_network_exampe_as_ints-800x388.png\" alt=\"\" width=\"800\" height=\"388\" srcset=\"http:\/\/www.soeren-in-norwegen.net\/blog\/wp-content\/uploads\/38_network_exampe_as_ints-800x388.png 800w, http:\/\/www.soeren-in-norwegen.net\/blog\/wp-content\/uploads\/38_network_exampe_as_ints-1024x496.png 1024w, http:\/\/www.soeren-in-norwegen.net\/blog\/wp-content\/uploads\/38_network_exampe_as_ints-768x372.png 768w, http:\/\/www.soeren-in-norwegen.net\/blog\/wp-content\/uploads\/38_network_exampe_as_ints-1536x744.png 1536w, http:\/\/www.soeren-in-norwegen.net\/blog\/wp-content\/uploads\/38_network_exampe_as_ints.png 1893w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><\/p>\n<p>Mit dem Bild erkennt man besser, dass sich der untersuchte Informationsinhalt nicht aendert. Ob <em>Apfel<\/em> jetzt auf <em>Kuchen<\/em> zeigt oder 23 auf 5 tut nix zur Sache, solange im gesamten Netzwerk 23 immer mit <em>Apfel<\/em> und 5 immer mit <em>Kuchen<\/em> assoziiert ist.<\/p>\n<p>Zum Problem der &#8222;Betriebskosten&#8220; der Wortobjekte kamen beim letzen Mal die Betriebskosten der &#8222;Waggons&#8220; (oder Ueberstrukturen) in denen diese aufbewahrt wurden. Ein Problem wurde es deshalb, weil jeder Titel einen solchen &#8222;Waggon&#8220; hat. Ganz spezifisch waren diese &#8222;Waggons&#8220; sogenannte Sets und deren &#8222;Betriebskosten&#8220; waren abhaengig von der Anzahl der darin enthaltenen Elemente.<br \/>\nDas Gute ist nun, dass es noch andere Arten von &#8222;Waggons&#8220; gibt. Fuer den Verwendungszweck hier ist nur wichtig, dass diese die &#8222;Aufbewahrungsbox&#8220; aller zu einem Titel geh\u00f8renden Links sind, damit nix durcheinander kommt. Dafuer brauche ich kein Set, wie beim letzten Mal erwaehnt, sondern es reicht ein sogenannten <a href=\"https:\/\/de.wikipedia.org\/wiki\/Tupel_(Informatik)\" target=\"_blank\" rel=\"noopener\">Tupel<\/a>.<br \/>\nWaehrend man mit Sets urst viel machen kann (bspw. Elemente heraus nehmen oder dazu packen, oder Mengenoperationen mit anderen Sets ausfuehren) kann man mit Tuples (fast) nix machen. Das ist ein unveraenderbarer &#8222;Kasten&#8220; fuer meine Links (die ja nun Zahlen sind). Und weil man damit so wenig machen kann, betragen die &#8222;Betriebskosten&#8220; eines leeren Tuples nur 56 Bytes und die steigen linear an (diesmal wirklich) mit 8 Byte pro neuem Element.<\/p>\n<p>Wie beim letzten Mal brauche ich nun das Produkt aus der Verteilung der Links pro Titel und dem tatsaechlichen Speicherbedarf der Tuples. Zum Vergleich habe ich in dieses Diagramm das Resultat dieser Rechnung und der gleichen Rechnung vom letzten Mal dargestellt.<\/p>\n<p><a href=\"http:\/\/www.soeren-in-norwegen.net\/blog\/wp-content\/uploads\/39_realer_Speicherbedarf_alle_tuples.png\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-11401 size-full\" src=\"http:\/\/www.soeren-in-norwegen.net\/blog\/wp-content\/uploads\/39_realer_Speicherbedarf_alle_tuples.png\" alt=\"\" width=\"730\" height=\"456\" \/><\/a><\/p>\n<p>So ein Mist, da aendert sich ja nicht viel \u2026 ach nee! Die Skala der linken Ordinate ist eine ganze Gr\u00f8szenordnung (!) kleiner als die Skala der rechten Ordinate \u2026 voll krass!<\/p>\n<p>Der Gesamtspeicherbedarf betraegt damit fuer alle &#8222;Tuple-Waggons&#8220; keine 11 GB wie bei den Sets, sondern nur 1,605,627,528 Bytes also ca. 1.6 GB.<br \/>\nDa kommen dann noch die ca. 300 MB fuer die oberste Struktur hinzu, welches alle &#8222;Waggons&#8220; den richtigen Titeln zuordnen (die &#8222;Lokomtive&#8220; vom letzten Mal bzw. das &#8222;Dictionary&#8220;). Insgesamt ben\u00f8tige ich mit diesen Modifikationen dann nur noch 6,7 GB.<\/p>\n<p>JIPPIE! So viel Speicher habe ich und deswegen soll das fuer heute reichen. So viel sei nur noch gesagt: hier hingeschrieben h\u00f8rt sich der Schritt der Abbildung der Titel auf ganze Zahlen voll logisch an. Deswegen war dieser Geniestreich als solcher auch zunaechst unbemerkt. Ich wollte ja erstmal nur das Speicherplatzproblem l\u00f8sen. Aber letztlich erlaubte mir erst dieser Schritt die (effiziente!) technische Implementierung der L\u00f8sung des eigentlichen Problems. Dazu Bedarf es allerdings noch ein paar weiterer (Achtung: Spoiler) &#8222;Transformationen&#8220;.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Endlich kann ich ueber diesen Geniestreich reden \u2026 aber ich greife vor. Beim vorletzten Mal &#8222;mathematisierte&#8220; ich das Kevin-Bacon-Problem. Das war prinzipiell l\u00f8sbar, aber ich stellte beim letzten Mal fest, dass es aufgrund von Speicherplatzmangel technisch in der gegebenen Form praktisch nicht l\u00f8sbar war. Ich redete beim letzten Mal viel ueber die &#8222;Betriebskosten&#8220; (in Form [&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\/11388"}],"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=11388"}],"version-history":[{"count":4,"href":"http:\/\/www.soeren-in-norwegen.net\/blog\/wp-json\/wp\/v2\/posts\/11388\/revisions"}],"predecessor-version":[{"id":11404,"href":"http:\/\/www.soeren-in-norwegen.net\/blog\/wp-json\/wp\/v2\/posts\/11388\/revisions\/11404"}],"wp:attachment":[{"href":"http:\/\/www.soeren-in-norwegen.net\/blog\/wp-json\/wp\/v2\/media?parent=11388"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.soeren-in-norwegen.net\/blog\/wp-json\/wp\/v2\/categories?post=11388"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.soeren-in-norwegen.net\/blog\/wp-json\/wp\/v2\/tags?post=11388"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}