Pandas procesamiento de archivos grandes (chunksize)
Al procesar archivos de datos grandes, la memoria puede ser insuficiente para cargar todos los datos de una sola vez. Pandas proporciona la función de lectura por bloques, que permite procesar los datos en lotes.
Lectura de CSV por bloques
Parámetro chunksize
Ejemplo
import pandas as pd
import io
# Simular contenido de archivo grande (reemplazar con la ruta del archivo en uso real)
data = """id,value
1,100
2,200
3,300
4,400
5,500
6,600
7,700
8,800
9,900
10,1000
"""
# Leer por bloques usando chunksize
chunks = pd.read_csv(io.StringIO(data), chunksize=3)
print("Procesamiento por bloques:")
for i, chunk in enumerate(chunks):
print(f"\nBloque {i+1}:")
print(chunk)
import io
# Simular contenido de archivo grande (reemplazar con la ruta del archivo en uso real)
data = """id,value
1,100
2,200
3,300
4,400
5,500
6,600
7,700
8,800
9,900
10,1000
"""
# Leer por bloques usando chunksize
chunks = pd.read_csv(io.StringIO(data), chunksize=3)
print("Procesamiento por bloques:")
for i, chunk in enumerate(chunks):
print(f"\nBloque {i+1}:")
print(chunk)
Procesamiento de agregación
Ejemplo
import pandas as pd
import io
import numpy as np
# Simular archivo grande
data = "value\n" + "\n".join([str(i) for i in range(1, 1001)])
# Calcular la suma por bloques
total = 0
count = 0
for chunk in pd.read_csv(io.StringIO(data), chunksize=100):
total += chunk["value"].sum()
count += len(chunk)
print(f"Número total de filas: {count}")
print(f"Suma total: {total}")
print(f"Promedio: {total / count}")
import io
import numpy as np
# Simular archivo grande
data = "value\n" + "\n".join([str(i) for i in range(1, 1001)])
# Calcular la suma por bloques
total = 0
count = 0
for chunk in pd.read_csv(io.StringIO(data), chunksize=100):
total += chunk["value"].sum()
count += len(chunk)
print(f"Número total de filas: {count}")
print(f"Suma total: {total}")
print(f"Promedio: {total / count}")
Procesamiento incremental
Filtrado
Ejemplo
import pandas as pd
import io
# Simular datos
data = """id,value,category
1,100,A
2,200,B
3,150,A
4,300,C
5,250,B
6,180,A
"""
# Filtrar datos que cumplan condiciones específicas
filtered_chunks = []
for chunk in pd.read_csv(io.StringIO(data), chunksize=2):
filtered = chunk[chunk["category"] == "A"]
if len(filtered) > 0:
filtered_chunks.append(filtered)
result = pd.concat(filtered_chunks)
print("Datos filtrados con category='A':")
print(result)
import io
# Simular datos
data = """id,value,category
1,100,A
2,200,B
3,150,A
4,300,C
5,250,B
6,180,A
"""
# Filtrar datos que cumplan condiciones específicas
filtered_chunks = []
for chunk in pd.read_csv(io.StringIO(data), chunksize=2):
filtered = chunk[chunk["category"] == "A"]
if len(filtered) > 0:
filtered_chunks.append(filtered)
result = pd.concat(filtered_chunks)
print("Datos filtrados con category='A':")
print(result)
Procesamiento paralelo con múltiples procesos
Ejemplo
import pandas as pd
import io
from concurrent.futures import ProcessPoolExecutor
# Procesamiento paralelo (adecuado para tareas intensivas en CPU)
def process_chunk(chunk):
"""Procesar un solo bloque de datos"""
return chunk["value"].sum()
# Simular datos
data = "value\n" + "\n".join([str(i) for i in range(1, 101)])
# Preparar bloques de datos
chunks = list(pd.read_csv(io.StringIO(data), chunksize=10))
# Procesamiento en serie
total = sum(process_chunk(chunk) for chunk in chunks)
print(f"Suma del procesamiento en serie: {total}")
import io
from concurrent.futures import ProcessPoolExecutor
# Procesamiento paralelo (adecuado para tareas intensivas en CPU)
def process_chunk(chunk):
"""Procesar un solo bloque de datos"""
return chunk["value"].sum()
# Simular datos
data = "value\n" + "\n".join([str(i) for i in range(1, 101)])
# Preparar bloques de datos
chunks = list(pd.read_csv(io.StringIO(data), chunksize=10))
# Procesamiento en serie
total = sum(process_chunk(chunk) for chunk in chunks)
print(f"Suma del procesamiento en serie: {total}")
Procesamiento de archivos JSON grandes
Ejemplo
import pandas as pd
import json
import io
# Simular datos en formato JSON Lines
jsonl_data = '\n'.join([
json.dumps({"id": i, "value": i * 10})
for i in range(1, 101)
])
# Leer JSON Lines por bloques
chunks = []
chunk_size = 20
for chunk in pd.read_json(io.StringIO(jsonl_data), lines=True, chunksize=chunk_size):
chunks.append(chunk)
if len(chunks) >= 3: # Procesar solo los primeros 3 bloques como ejemplo
break
result = pd.concat(chunks)
print(f"Se leyeron {len(result)} filas de datos")
print(result.head())
import json
import io
# Simular datos en formato JSON Lines
jsonl_data = '\n'.join([
json.dumps({"id": i, "value": i * 10})
for i in range(1, 101)
])
# Leer JSON Lines por bloques
chunks = []
chunk_size = 20
for chunk in pd.read_json(io.StringIO(jsonl_data), lines=True, chunksize=chunk_size):
chunks.append(chunk)
if len(chunks) >= 3: # Procesar solo los primeros 3 bloques como ejemplo
break
result = pd.concat(chunks)
print(f"Se leyeron {len(result)} filas de datos")
print(result.head())
Otras extensionesEl procesamiento por bloques puede reducir significativamente el uso de memoria, pero aumentará el tiempo de procesamiento. Elija un tamaño de chunk razonable para equilibrar memoria y tiempo.