Große Dateien streamen
Dateien verarbeiten, ohne alles zu laden
Große Dateien streamen ist eine kostenlose Go Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Go Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.
Das Problem mit dem vollständigen Laden
Eine mehrere Gigabyte große Datei mit os.ReadFile vollständig in den Speicher zu laden, kann den Arbeitsspeicher erschöpfen. Streamen Sie die Datei stattdessen: Verarbeiten Sie die Blöcke, sobald sie eintreffen.
Das Streaming-Konzept
Streaming bedeutet, dass Sie jeweils nur ein kleines Datenfenster im Speicher behalten. Zusammen mit Pufferung können Sie dadurch beliebig große Eingaben mit konstantem Speicherbedarf verarbeiten.
Zeile für Zeile mit Scanner
Bei Text verarbeitet ein bufio.Scanner über einem Reader unabhängig von der Dateigröße jeweils eine Zeile. Hier simulieren wir eine Datei mit einem strings.Reader.
package main
import (
"bufio"
"fmt"
"strings"
)
func main() {
src := strings.NewReader("alpha\nbeta\ngamma")
s := bufio.NewScanner(src)
for s.Scan() {
fmt.Println("processed:", s.Text())
}
}Zählen ohne vollständiges Laden
Sie können Statistiken über einen riesigen Datenstrom berechnen, während Sie fast keine Daten im Speicher halten.
package main
import (
"bufio"
"fmt"
"strings"
)
func main() {
s := bufio.NewScanner(strings.NewReader("a\nbb\nccc"))
total := 0
for s.Scan() {
total += len(s.Text())
}
fmt.Println("total chars:", total)
}Blöcke fester Größe
Lesen Sie Binärdaten mit Read in einen Puffer fester Größe. n gibt an, wie viele Bytes eingefüllt wurden.
package main
import (
"fmt"
"io"
"strings"
)
func main() {
src := strings.NewReader("0123456789")
buf := make([]byte, 4)
for {
n, err := src.Read(buf)
if n > 0 {
fmt.Printf("chunk: %s\n", buf[:n])
}
if err == io.EOF {
break
}
}
}io.Copy für Streaming
io.Copy(dst, src) streamt alles von einem Reader zu einem Writer und verwendet dabei einen kleinen internen Puffer – ohne die Daten vollständig zu laden.
package main
import (
"io"
"os"
"strings"
)
func main() {
src := strings.NewReader("streamed straight through\n")
io.Copy(os.Stdout, src)
}Puffer für Reader und Writer kombinieren
Umschließen Sie beide Enden mit bufio, um Transformationen effizient zu streamen: gepuffert lesen, verarbeiten, gepuffert schreiben und den Puffer leeren.
package main
import (
"bufio"
"os"
"strings"
)
func main() {
r := bufio.NewScanner(strings.NewReader("one\ntwo"))
w := bufio.NewWriter(os.Stdout)
defer w.Flush()
for r.Scan() {
w.WriteString(r.Text() + "!\n")
}
}Garantie für konstanten Speicherbedarf
Da die Puffergröße festgelegt ist, bleibt der Speicherverbrauch gleich, unabhängig davon, ob die Eingabe 1 KB oder 1 TB groß ist. Das ist der entscheidende Vorteil von Streaming.
Häufige Fehler vermeiden
- Rufen Sie
os.ReadFilenicht für riesige Dateien auf - Verarbeiten Sie immer die
nBytes, bevor Sie den Fehler prüfen - Denken Sie daran, gepufferte Writer mit
Flush()zu leeren
Einen Datenstrom transformieren
Hier wandeln wir jede Zeile während des Streamings in Großbuchstaben um und behalten zu jedem Zeitpunkt nur eine Zeile im Speicher.
package main
import (
"bufio"
"os"
"strings"
)
func main() {
s := bufio.NewScanner(strings.NewReader("hi\nthere"))
w := bufio.NewWriter(os.Stdout)
defer w.Flush()
for s.Scan() {
w.WriteString(strings.ToUpper(s.Text()) + "\n")
}
}Wann Sie streamen sollten
Streamen Sie, wenn die Eingabe groß oder ihre Größe unbekannt ist oder wenn Sie sie schrittweise verarbeiten können. Laden Sie Daten nur dann vollständig, wenn sie klein und begrenzt sind und Sie sie als Ganzes benötigen.
Kurze Überprüfung
Testen Sie Ihr Wissen über Streaming.
Zusammenfassung
Sie haben gelernt, große Datenmengen zu verarbeiten, ohne sie vollständig zu laden.
- Scanner für Textverarbeitung Zeile für Zeile
Readmit fester Größe für Binärdatenblöckeio.Copyfür Datenstrom-zu-Datenstrom- Beide Enden puffern, Writer leeren, konstanten Speicherbedarf gewährleisten
Häufig gestellte Fragen
Ist die Lektion „Große Dateien streamen“ kostenlos?
Ja — der vollständige Text von „Große Dateien streamen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Go Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Große Dateien streamen“?
Dateien verarbeiten, ohne alles zu laden Du übst Go Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Go Academy zu starten?
Keine Vorkenntnisse erforderlich. Go Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Große Dateien streamen“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Go Academy-Lektion Code schreiben und ausführen?
Ja. Jede Go Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Gepufferte Reader
- Scanner
- Gepufferte Writer
- Große Dateien streamen