0Pricing
Go Academy · Lección

Transmisión de archivos grandes

Procese archivos sin cargarlos por completo

Transmisión de archivos grandes es una lección gratuita de Go Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Go Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Go Academy incluye 4 lecciones en total.

El problema de cargarlo todo

Leer un archivo de varios gigabytes en memoria con os.ReadFile puede agotar la RAM. En su lugar, procéselo en streaming: procese los bloques a medida que llegan.

Concepto de streaming

El streaming consiste en mantener en memoria solo una pequeña ventana de datos cada vez. Combinado con el uso de búferes, permite procesar entradas de tamaño arbitrario con memoria constante.

Línea por línea con Scanner

Para texto, un bufio.Scanner sobre un lector procesa una línea cada vez, independientemente del tamaño del archivo. Aquí simulamos un archivo con un 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())
	}
}

Contar sin cargarlo todo

Puede calcular estadísticas sobre un flujo enorme manteniendo casi nada en memoria.

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)
}

Bloques de tamaño fijo

Para datos binarios, lea en un búfer de tamaño fijo con Read. n indica cuántos bytes se han rellenado.

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 para streaming

io.Copy(dst, src) transmite todo de un lector a un escritor mediante un búfer interno pequeño, sin cargarlo todo en memoria.

package main

import (
	"io"
	"os"
	"strings"
)

func main() {
	src := strings.NewReader("streamed straight through\n")
	io.Copy(os.Stdout, src)
}

Combinar búferes de lectores y escritores

Envuelva ambos extremos en bufio para realizar transformaciones de streaming de forma eficiente: lectura con búfer, procesamiento, escritura con búfer y vaciado.

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")
	}
}

Garantía de memoria constante

Como el tamaño del búfer es fijo, el uso de memoria se mantiene estable tanto si la entrada es de 1 KB como de 1 TB. Esta es la principal ventaja del streaming.

Evitar errores habituales

  • No llame a os.ReadFile con archivos enormes
  • Gestione siempre los n bytes antes de comprobar el error
  • Recuerde llamar a Flush() en los escritores con búfer

Transformar un flujo

Aquí convertimos cada línea a mayúsculas a medida que pasa por el flujo, manteniendo en memoria solo una línea cada vez.

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")
	}
}

Cuándo usar streaming

Use streaming cuando el tamaño de la entrada sea grande o desconocido, o cuando pueda procesarla de forma incremental. Cárguela por completo solo si se trata de datos pequeños y acotados que necesita tener disponibles de una vez.

Comprobación rápida

Compruebe sus conocimientos sobre streaming.

Recapitulación

Ha aprendido a procesar grandes cantidades de datos sin cargarlas por completo.

  • Scanner para texto línea por línea
  • Read de tamaño fijo para bloques binarios
  • io.Copy para transmitir de un flujo a otro
  • Use búferes en ambos extremos, vacíe los escritores y mantenga una memoria constante

Preguntas frecuentes

¿La lección «Transmisión de archivos grandes» es gratis?

Sí — el texto completo de «Transmisión de archivos grandes» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Go Academy, actualiza a CoddyKit PRO. El curso de Go Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Transmisión de archivos grandes»?

Procese archivos sin cargarlos por completo Practicas Go Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Go Academy?

No se requiere experiencia previa. Go Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Transmisión de archivos grandes»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Go Academy?

Sí. Cada lección de Go Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Lectores con búfer
  2. Scanners
  3. Escritores con búfer
  4. Transmisión de archivos grandes
← Volver a Go Academy