Nein, eine Datei wird beim Öffnen nicht automatisch in den Speicher eingelesen. Das wäre schrecklich ineffizient. sed
Liest beispielsweise wie viele andere Unix-Tools seine Eingabe zeilenweise. Es muss selten mehr als die aktuelle Zeile gespeichert werden.
Mit ist awk
es das selbe. Es wird jeweils ein Datensatz gelesen , der standardmäßig eine Zeile ist. Wenn Sie Teile der Eingabedaten in Variablen speichern, ist das natürlich zusätzlich 1 .
Einige Leute haben die Angewohnheit, Dinge wie zu tun
for line in $(cat file); do ...; done
Da die Schal der erweitern müssen $(cat file)
Befehlssubstitutions vollständig , bevor noch die erste Iteration des for
Laufschleife, dies wird die gesamte liest file
in den Speicher (in den von der Shell benutzten Speicher der auszuführende for
Schleife). Das ist ein bisschen albern und auch unelegant. Stattdessen sollte man tun
while IFS= read -r line; do ...; done <file
Dies wird file
zeilenweise verarbeitet (aber lesen Sie "IFS = read -r line" ).
Das zeilenweise Verarbeiten von Dateien in der Shell ist jedoch nur selten erforderlich, da die meisten Dienstprogramme ohnehin zeilenorientiert sind (siehe Warum wird eine Shell-Schleife zum Verarbeiten von Text verwendet, der als fehlerhaft angesehen wird? ).
Ich arbeite in der Bioinformatik und bei der Verarbeitung großer Mengen genomischer Daten wäre ich nicht in der Lage, viel zu tun, wenn ich nicht nur die Teile der Daten im Speicher belasse, die unbedingt erforderlich sind. Wenn ich beispielsweise die Datenbits entfernen muss, mit denen Personen aus einem 1-Terabyte-Datensatz mit DNA-Varianten in einer VCF-Datei identifiziert werden können (da diese Art von Daten nicht öffentlich zugänglich gemacht werden kann), gehe ich zeilenweise vor Bearbeitung mit einem einfachen awk
Programm (dies ist möglich, da das VCF-Format zeilenorientiert ist). Ich nicht lesen Sie die Datei in den Speicher, verarbeiten es dort, und schreiben Sie es wieder heraus! Wenn die Datei komprimiert wäre, würde ich sie durchlaufen lassen zcat
oder gzip -d -c
, da gzip
Streaming-Verarbeitung von Daten, auch nicht die gesamte Datei in den Speicher lesen.
Selbst bei nicht zeilenorientierten Dateiformaten wie JSON oder XML gibt es Stream-Parser, mit denen große Dateien verarbeitet werden können, ohne dass alles im RAM gespeichert werden muss.
Bei ausführbaren Dateien ist dies etwas komplizierter, da gemeinsam genutzte Bibliotheken bei Bedarf geladen und / oder von Prozessen gemeinsam genutzt werden können (siehe z. B. Laden von gemeinsam genutzten Bibliotheken und RAM-Nutzung ).
Caching habe ich hier nicht erwähnt. Dies ist die Aktion, bei der RAM zum Speichern von Daten verwendet wird, auf die häufig zugegriffen wird. Kleinere Dateien (z. B. ausführbare Dateien) können vom Betriebssystem in der Hoffnung zwischengespeichert werden, dass der Benutzer viele Verweise auf sie erstellt. Abgesehen vom ersten Lesen der Datei werden nachfolgende Zugriffe auf den Arbeitsspeicher und nicht auf die Festplatte durchgeführt. Caching, wie das Puffern von Eingaben und Ausgaben, ist normalerweise für den Benutzer weitgehend transparent, und die Menge an Arbeitsspeicher, die zum Cachen von Dingen verwendet wird, kann sich in Abhängigkeit von der von Anwendungen usw. zugewiesenen RAM-Menge dynamisch ändern.
1 Technisch gesehen lesen die meisten Programme wahrscheinlich jeweils einen Teil der Eingabedaten, entweder explizit gepuffert oder implizit durch die Pufferung, die die Standard-E / A-Bibliotheken durchführen, und präsentieren diesen Teil dann zeilenweise im Code des Benutzers. Es ist viel effizienter, ein Vielfaches der Blockgröße der Festplatte zu lesen, als z. B. ein Zeichen gleichzeitig. Diese Blockgröße ist jedoch selten größer als eine Handvoll Kilobyte.