# Wie und wo speichert ein Computer Daten? ###### tags: `Vl Datenanalyse` ## Datentypen ### Das Binärsystem Durch Nullen und Einsen kann man beliebige Zahlen darstellen. Zum Beispiel gibt es $2^3=8$ Möglichkeiten, vierstellige Kombinationen aus 0 und 1 zu erzeugen: ``` 0: 000 1: 001 2: 010 3: 011 4: 100 5: 101 6: 110 7: 111 ``` Wenn wir vier Binärziffern haben, können wir $2^4=16$ Kombinationen erzeugen, um die Zahlen von 0 bis 15 zu beschreiben. Dazu nehmen wir die 8 Kobinationen von eben und stellen erst stets eine 0, dann stets eine 1 voran: ``` 0: 0000 1: 0001 2: 0010 3: 0011 4: 0100 5: 0101 6: 0110 7: 0111 8: 1000 9: 1001 10: 1010 11: 1011 12: 1100 13: 1101 14: 1110 15: 1111 ``` Allgemein kann man mit $n$ Ziffern $2^n$ verschiedene Kombinationen darstellen, die man verwendet, um die Zahlen von $0$ bis $2^n-1$ darzustellen. Die Reihenfolge folgt derselben Regel wie im Dezimalsystem: um zur nächsten Zahl zu gelangen, versucht man zunächst, die Ziffer ganz rechts zu erhöhen. Wenn aber diese letzte Ziffer bereits die höchste Ziffer erreicht hat (im Dezimalsystem 9, im Binärsystem 1), dann setzt man sie auf 0 und erhöht die Ziffer links daneben (Übertrag, engl. "carry", in der Grundschule "Eins gemerkt"), und wenn die Ziffer auch maximal ist, geht man aufdieselbe Weise einen weiteren Schritt nach links. ### Bits und Bytes Jede einzelne Ziffer (0 oder 1) nennen wir eine "Binärziffer", english "binary digit", oder kurz "bit". Jeweils 8 Bits werden zu einem sog. "Byte" zusammengesetzt. Moderne Computer verarbeiten beim Rechnen meist 32 Bits (4 Bytes) oder sogar 64 Bits (8 Bytes) auf einmal. - 1 Kilobyte (1 KB) sind 1024 Bytes (oder manchmal 1000 Bytes) - 1 Megabyte (1 MB) sind 1.048.576 Bytes (oder 1.000.000 Bytes) - 1 Gigabyte (1 GB) sind 1.07 Milliarden Bytes (oder oft 1 Milliarde Bytes) - 1 Terabyte (1 TB) sind 1.1 Billionen Bytes (oder oft 1 Billion Bytes) ### Ganze Zahlen (Integers) Mit diesen 32 Bits lassen sich die natürlichen Zahlen von 0 bis $2^{32}-1=4.294.967.295$ darstellen. Wenn man auch negative Zahlen haben möchte, verwendet man eine abgewandelte Form (sog. Zweier-Komplement-Darstellung), die die Zahlen $-2.147.483.648$ bis $2.147.483.647$ abdeckt. Wir stellen hier "ganze Zahlen" dar (d.h., Zahlen ohne Nachkomma-Anteil dar, also was in der Schule $\mathbb{Z}$ hieß); auf englisch: "integer numbers" oder kurz "integers" (von lat. "integer" = "ganz") ### Fließkommazahlen (Floating point numbers) In der Wissenschaft werden Zahlen oft in der sog. *wissenschaftlichen Notation* (*scientific notation*) dargestellt, z.B.: $6,\!02214\cdot10^{23}$ (Avogadrosche Zahl) oder $1,\!60218\cdot10^{−19}\,\mathrm{C}$ (Elementarladung). Hier zerlegen wir die Zahl in eine "Mantisse" (6.022) und einen "Exponenten" (23). Computer speichern Kommazahlen ähnlich, aber zur Basis 2 statt 10. Die Avogadrosche Zahl wird im Binärsystem dargestellt als: $\quad1,\!9925\cdot2^{78} = 1,\!1111111000_2\cdot 10_2^{01001110_2}$ Meist werden Fließkommazahlen in Computern in 4 Bytes gespeichert: 52 Bits für die Mantisse, 11 Bits für den Exponenten und 1 Bit für das Vorzeichen. Solche Zahlen nennt man "double-precision floating point numbers" oder kurz "Doubles". ("Single-precision", also nur 2 Bytes, wird fast nie verwendet.) ### Zeichen (Characters) und Zeichenketten (character strings) Text besteht aus Zeichen ("characters"). Dazu gehören Buchstaben, Ziffern, Satzzeichen, Sonderzeichen, Steuerzeichen usw. Jedem Zeichen ist eine Zahl (character code) zugeordnet. Meistens wird für jedes Zeichen ein Byte verwendet. #### ASCII-Code Der American Standard Code for Information Interchange (ASCII) legt die Bedeutung der Codes von 0 bis 127 fest: Auszug aus der ASCII-Tabelle: - Leerzeichen: 32; Ausrufezeichen: 33, Anführungzeichen: 34, ... - Ziffern von 0 bis 9: 46 bis 57 - Großbuchstaben von A bis Z: 65 bis 90 - Kleinbuchstaben von a bis z: 97 bis 122 Außerdem gibt es sog. Steuerzeichen: - neue Zeile anfangen (Windows): 13, gefolgt von 10 - neue Zeile anfangen (MacOS, Linux): 10 - neue Seite anfangen (manchmal): 12 - neue Tabellen-Spalte anfangen ("Tabulator"): 9 - Piepsen / Glocke: 7 - Ende der Übertragung: 4 #### Codeseiten Dem ASCII-Code fehlen Codes für sprach-spezifische Zeichen (z.B. Umlaute), für andere Schriften und für viele Sonderzeichen. Daher wurden eine Vielzahl landesspezifischer Erweiterungen festgelegt. (Beispiel: Code 156 steht in der Code-Erweiterung 1252/Westeuropa für "œ" und in der Code-Erweiterung 1250/Osteuropa für "ś".) Ohne zu wissen, welche Codetabelle ("Encoding") verwendet wurde, lässt sich text nicht korrekt darstellen. #### Unicode Das Unicode-Projekt versucht, *jedem* Zeichen, das irgendwo in der Welt verwendet wird, eine Code-Zahl zuzuordnen, von 65 für "A" (wie in ASCII) über z.B. 426 für "Ц", 3512 für "ම" und 20820 für "兔" bis 128007 für "🐇". Der Anfang von Unicode ist der ASCII-Code (um abwärtskompatibel) zu sein. Da Unicodes nun unterschiedlich lang sein können, braucht es ein System, um zu markieren, wann ein Zeichen mehr als ein Byte braucht. Diese Systeme heißen Unicode Transfer Formats (UTFs), und man muss für eine Datei wissen, welches UTF-Encoding verwendet wurde. #### ASCII und UTF-8 Wenn in einer Datei nur Zeichen aus dem ASCII-Code verwendet werden, ist das Encoding (fast) egal: Jedes Zeichen ist genau ein Byte. ASCII und Unicode stimmen überein. Daher vermeidet man beim Programmieren Probleme, wenn man nicht-ASCII-Zeichen (wie Umlaute und gewisse Sonderzeichen) vermeidet. #### Datentypen in R Vektoren in R können alle drei der beschriebenen Datentypen haben: ```r 1:4 -> my_integer_vector c( 2.3, 1.4, -1.2e7, 1.1e-3 ) -> my_floating_point_vector c( "A", "Word", "This is a sentence.", "123" ) -> my_string_vector ``` ![](https://i.imgur.com/liXsWH8.png) R verwendet verschiedene Synonyme für die Datentypen: - integer: abgekürzt "int" - floating point: in R "numeric" ("num"), in Tidyverse "double" ("dbl") - strings: "character" ("chr") -- Eigentlich unterscheidt man zwischen einzelnen Zeichen (characters) und Zeichenketten (strings); R verwendet die Begriffe synonym. Strings stehen immer in Anführungszeichen. In einem Vektor kann man Datentypen nicht mischen. Wenn man es dennoch versucht, erhält man den kleinsten gemeinsamen Nenner (meist "chr"). ## Arbeitsspeicher und Festplatte Ein Computer enthält zwei Arten von Speicher: | Arbeitsspeicher (RAM) | Festplatte (disk) | | ----------------|------------| | flüchtig | dauerhaft | | schnell | langsamer | | teurer | billiger | - Der Arbeitsspeicher ist flüchtig, er vergisst alle Daten, wenn der Computer ausgeschaltet oder neu gestartet wird. - Daten vom Arbeitsspeicher braucht nur einige Nanosekunden; bei der Festplatte dauert es 100 - 1000 mal länger - Der Prozessor kann nur Daten verarbeiten, die im Arbeitsspeicher vorliegen und legt Ergebnisse auch wieder dort ab. - Daher muss man vor einer Rechnung die Daten von der Festplatte in den Arbeitsspeicher kopieren (Daten "laden" oder "einlesen", engl. "to load / to read data"). - Wenn man Ergebnisse oder andere Daten behalten will, muss man sie vom Arbeitsspeicher zur Festplatte kopieren (Daten "speichern" oder "sichern", "to store / to save / to write data") - Typische Laptops haben heute 8-16 GB Arbeitsspeicher und 1000 GB Festplatte. - Unsere NHANES-Tabelle braucht im Arbeitsspeicher etwas 0.4 MB: ``` > object.size(nhanes) 424112 bytes ``` ## Dateien und Dateiformate Auf der Festplatte werden Daten zu Dateien (files) zusammengefasst. Jede Datei hat einen Namen (file name). Oft wird der Dateiname durch einen Punkt in zwei Teile aufgeteilt, wobei der hintere Teil ("file name extension") kurz ist (2-4 Buchstaben) und den Dateityp angibt. Windows zeigt die Extension oft nicht an, obwohl sie Teil des Namens ist. Zunächst ist die Datei einfach eine Folge von (evtl. sehr vielen) Bytes. Das *Dateiformat* gibt an, wie diese zu interpretieren sind. #### Textdateien (plain text files) Bei einer Textdatei steht jedes Byte für ein Zeichen, gemäß dem ASCII-Code (oder gemäß Unicode). - Textdateien haben nur einfachste Formatierung: im Grunde gibt es nur den Zeilenumbruch ("new line") als Steuercode. - Word-Dateien sind keine Text-Dateien, denn sie enthalten außer Zeichen und Zeilenumbrüchen auch andere Formatierungen (Schriftart, kursiv, Abstände, etc.) - HTML-Dateien sind Text-Dateien, denn die Formatierungen sind durch Zeichen bezeichnet ("rich text" statt "plain text"). - R-Skripte sind Textdateien - Textdateien kann man Zeile für Zeile lesen (in R mit "read.lines") - "Notepad" (Windows) und "TextEdit" (MacOS) sind Standard-Programme, um Textdateien zu lesen und zu schreiben. ##### CSV-Dateien Unsere NHANES-Beispiel-Daten schauen in ein Texteditor so aus: ``` subjectId,gender,age,height,weight,ethnicity 93703,female,2,88.6,13.7,NH Asian 93704,male,2,94.2,13.9,NH White 93705,female,66,158.3,79.5,NH Black 93706,male,18,175.7,66.3,NH Asian 93707,male,13,158.4,45.4,Other/Mixed 93708,female,66,150.2,53.5,NH Asian 93709,female,75,151.1,88.8,NH Black 93710,female,0,NA,10.2,NH White 93711,male,56,170.6,62.1,NH Asian 93712,male,18,172.8,58.9,Mexican 93713,male,67,178.6,74.9,NH White 93714,female,54,147.8,87.1,NH Black [...] ``` Das Dateiformat dieser sog. CSV-Datei (comma-separated values) ist also wie folgt: - Das Zeilenumbruch-Steuerzeichen trennt Tabellenzeilen - Das Komma trennt Tabellenspalten - Die erste Zeile enthält die Spalten-Namen - Zahlen werden im Dezimalsystem (aus Zifferzeichen) angegeben, nicht im Binärstystem. - Als Dezimaltrenner wird der Punkt verwendet. Die Tidyverse-Funktion `read_csv` liest solche Dateien ein. Varianten: - Statt Komma wird oft das Tabulator-Steuerzeichen verwendet ("TSV-Datei" oder, in MS Excel, "TXT-Datei"; lesen mit `read_tsv`). - Deutschsprachiges MS-Excel verwendet Komma statt Punkt als Dezimaltrenner und Strichpunkt statt Komma als Spaltentrenner (lesen mit `read_csv2`) - Wenn ein String ein Komma enthält, muss der String in Anführungszeichen. - Die Funktion `read_delim` erlaubt, alle diese Details einzeln einzustellen. #### Binärdateien Wenn die Bytefolge nicht als Zeichenfolge, sondern zumindest z.T. als Folge von Binärzahlen gelesen werden soll, spricht man einer Binärdatei. ##### Beispiel 1: Maschinencode Instruktionen für den Prozessor (also Programme, die direkt ausgeführt werden können), liegen als Datei vor, wo die Zahlen für Maschinenbefehle kodieren. ##### Beispiel 2: Rastergrafik Ein einfaches (aber veraltetes) Format für Bilddateien ist das PPM-Format: - Die ersten beiden Bytes sind stets 80 und 54. - Dann folgen zwei Zahlen (je 2 Byte) mit Breite und Höhe in Pixeln - Dann folgen die Pixel-Farben, Zeile für Zeile von oben nach unten und links nach rechts: Für jedes Pixel drei Bytes mit der Leuchtstärke im roten, grünen und blauen Kanal. ##### Beispiel 3: Word-Datei MS Word muss wissen, welche Bytes Text anthalten und welche Bytes Formatierungs-Informationen. ##### Beispiel 4: komprimierte Dateien Bestimmte Codes bedeuten z.B. "Nun folgen 10 Bytes mit Wert 0" (vereinfacht) #### Markup-Formate Textdateien können Formatierungsinformationen in einem für Menschen leicht lesbaren Format enthalten. Eine typische HTML-Datei (hypertext mark-up language, das Dateiformat für Webseiten) könnte z.B. diese Zeile enthalten: ``` <p>This is a paragraph with word in <b>bold</b> and in <i>italic</i>.</p> ``` Ein Webbrowser zeigt das so an: This is a paragraph with word in **bold** and in *italic*. ## Dateien und Verzeichnisse - Jede Datei (file) hat einen Namen und wird mit diesem Namen in einem Verzeichnis (directory) gelistet. - Verzeichnisse werden auch als Ordner (folders) bezeichnet. - Ein Verzeichnis kann nicht nur Dateien enthalten, sondern auch Unterverzeichnisse (subdirectories). - Eine Festplatte enthält viele Verzeichnisse, die hierarchisch organisiert sind: - Es gibt ein Wurzelverzeichnis (root directory), dass alle anderen Verzeichnisse direkt oder indirekt (als Unterverzeichnis eines Unterverzeichnisses, etc.) enthält. - Die Verzeichnis-Hierarchie lässt sich als Baum darstellen. Um eine Datei zu laden, muss man angeben, in welchem Verzeichnis sie liegt und wie man dieses Verzeichnis findet. Diese Angabe nennt man einen "Pfad" (Path). Beispiel: Der Pfad zu unserer Beispiel-Datei `nhanes.csv` ist auf meinem Laptop: ``` /home/anders/Downloads/nhanes.csv ``` - Der Schrägstrich (slash) am Anfang bezeichnet das Wurzelverzeichnis. - Im Wurzelverzeichnis gibt es in Linux stets ein Unterverzeichnis `home`, dass die Daten aller Benutzer enthält. Jeder Benutzer hat ein Unterverzeichnis in `home`, dass mit seinem Benutzernamen benannt ist. - Mein Benutzername (user name, oder Kontoname, account name) ist `anders` und mein Benutzerverzeichnis (user directory oder home directory) heisst ebenso. - Mein Webbrowser hat in meinem Benutzer ein Verzeichnis `Downloads` angelegt, um dort alle herunter geladenen Dateien zu speichern. - Deshalb ist die `nhanes.csv`-Datei dort gelandet. Komplikationen: - Das Verzeichnis mit allen Benutzerverzeichnissen heisst bei Linux `home`, bei MacOS `users` und bei Windows `Users`. - Windows verwendet statt normalen Schrägstrichen (slashes, "/") Rückwärts-Schrägstriche (backslashes, "\\"), um in Pfaden die Verzeichnisse zu trennen. Wenn man einen Windows-Pfad in R eingibt, verwendet man aber dennoch Vorwärts-Slashes (oder doppelte Backslashes, `\\Users\\MaxMueller\\Downloads\\nhanes.csv`) - Der File Explorer (Windows), Finder (Mac), oder File Manager (Linux) blenden oft den Teil des Pfades bis zum Home-Verzeichnis aus. - Der Windows File Explorer blendet auch die Dateierweiterung (`.csv`) aus. - Unter Windows stellt man oft `C:` voran, was für die Haupt-Festplatte steht. - *Mehrere Laufwerke:* Neben der Haupt-Festplatte hat man vielleicht noch weitere Festplatten und/oder USB-Sticks. Diese werden bei MacOS und Linux in den Verzeichnis-Baum eingehängt, z.B. `/media/USB_Stick/blah.txt`. Unter Windows wird ein getrennter Baum angelegt, und z.B. mit `D:` gekennzeichnet. ##### Arbeitsverzeichnis und relative Pfade Jede Anwendung, und somit auch R und RStudio haben stets ein Verzeichnis, das als das "Arbeitsverzeichnis" (working directory) bezeichnet wird. In RStudio kann man das Arbeitsverzeichnis mit der Menüfunktion "Set working directory" im Menü "Session" einstellen. In der R-Konsole kann man es mit `getwd()` abfragen und mit z.B. `setwd(/home/anders/Downloads)` setzten. Man kann eine Pfad-Angabe an zwei Stellen anfangen lassen: - absoluter Pfad, beginnt mit "/": Start im Wurzelverzeichnis - relativer Pfad, beginnt nicht mit "/": Start im Arbeitsverzeichnis. Beispiele: - Das Arbeitsverzeichnis ist das Home-Verzeichnis `/home/anders`. Dann kann man statt `/home/anders/Downloads/nhanes.csv` einfach `Downloads/nhanes.csv` schreiben. - Das Arbeitsverzeichnis ist `/home/anders/Downlaods`. Dann kann man statt `/home/anders/Downloads/nhanes.csv` einfach nur `nhanes.csv` schreiben. Unter Linux und MacOS kann man auch Verzeichnisse relative zum Home-Verzeichnis beschreiben, indem man mit `~` (Tilde) anfängt: `~/Downloads/nhanes.csv`