Обработка больших файлов в Pandas (chunksize) | Учебник Runoob
При обработке больших файлов данных памяти может не хватить для загрузки всех данных сразу. Pandas предоставляет возможность чтения по чанкам для обработки данных пакетами.
Чтение CSV по чанкам
параметр chunksize
Пример
import pandas as pd
import io
# Имитация содержимого большого файла (замените на путь к файлу при реальном использовании)
data = """id,value
1,100
2,200
3,300
4,400
5,500
6,600
7,700
8,800
9,900
10,1000
"""
# Используйте chunksize для чтения по чанкам
chunks = pd.read_csv(io.StringIO(data), chunksize=3)
print("Обработка чанков:")
for i, chunk in enumerate(chunks):
print(f"\n"Чанк {i+1}:")
print(chunk)
import io
# Имитация содержимого большого файла (замените на путь к файлу при реальном использовании)
data = """id,value
1,100
2,200
3,300
4,400
5,500
6,600
7,700
8,800
9,900
10,1000
"""
# Используйте chunksize для чтения по чанкам
chunks = pd.read_csv(io.StringIO(data), chunksize=3)
print("Обработка чанков:")
for i, chunk in enumerate(chunks):
print(f"\n"Чанк {i+1}:")
print(chunk)
Обработка агрегации
Пример
import pandas as pd
import io
import numpy as np
# Имитация большого файла
data = "value\n" + "\n".join([str(i) for i in range(1, 1001)])
# Вычислить сумму по чанкам
total = 0
count = 0
for chunk in pd.read_csv(io.StringIO(data), chunksize=100):
total += chunk["value"].sum()
count += len(chunk)
print(f"Всего строк: {count}")
print(f"Сумма: {total}")
print(f"Среднее: {total / count}")
import io
import numpy as np
# Имитация большого файла
data = "value\n" + "\n".join([str(i) for i in range(1, 1001)])
# Вычислить сумму по чанкам
total = 0
count = 0
for chunk in pd.read_csv(io.StringIO(data), chunksize=100):
total += chunk["value"].sum()
count += len(chunk)
print(f"Всего строк: {count}")
print(f"Сумма: {total}")
print(f"Среднее: {total / count}")
Инкрементальная обработка
Фильтрация
Пример
import pandas as pd
import io
# Имитация данных
data = """id,value,category
1,100,A
2,200,B
3,150,A
4,300,C
5,250,B
6,180,A
"""
# Фильтрация данных с определёнными условиями
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("Фильтрация данных category='A':")
print(result)
import io
# Имитация данных
data = """id,value,category
1,100,A
2,200,B
3,150,A
4,300,C
5,250,B
6,180,A
"""
# Фильтрация данных с определёнными условиями
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("Фильтрация данных category='A':")
print(result)
Многопроцессная параллельная обработка
Пример
import pandas as pd
import io
from concurrent.futures import ProcessPoolExecutor
# Параллельная обработка (подходит для задач, интенсивно использующих ЦП)
def process_chunk(chunk):
"""Обработать один фрагмент"""
return chunk["value"].sum()
# Имитация данных
data = "value\n" + "\n".join([str(i) for i in range(1, 101)])
# Подготовка фрагментов данных
chunks = list(pd.read_csv(io.StringIO(data), chunksize=10))
# Последовательная обработка
total = sum(process_chunk(chunk) for chunk in chunks)
print(f"Сумма последовательной обработки: {total}")
import io
from concurrent.futures import ProcessPoolExecutor
# Параллельная обработка (подходит для задач, интенсивно использующих ЦП)
def process_chunk(chunk):
"""Обработать один фрагмент"""
return chunk["value"].sum()
# Имитация данных
data = "value\n" + "\n".join([str(i) for i in range(1, 101)])
# Подготовка фрагментов данных
chunks = list(pd.read_csv(io.StringIO(data), chunksize=10))
# Последовательная обработка
total = sum(process_chunk(chunk) for chunk in chunks)
print(f"Сумма последовательной обработки: {total}")
Обработка больших JSON-файлов
Пример
import pandas as pd
import json
import io
# Имитация данных в формате JSON Lines
jsonl_data = '\n'.join([
json.dumps({"id": i, "value": i * 10})
for i in range(1, 101)
])
# Чтение JSON Lines по частям
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: # Обрабатываем только первые 3 части в качестве примера
break
result = pd.concat(chunks)
print(f"Прочитано {len(result)} строк данных")
print(result.head())
import json
import io
# Имитация данных в формате JSON Lines
jsonl_data = '\n'.join([
json.dumps({"id": i, "value": i * 10})
for i in range(1, 101)
])
# Чтение JSON Lines по частям
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: # Обрабатываем только первые 3 части в качестве примера
break
result = pd.concat(chunks)
print(f"Прочитано {len(result)} строк данных")
print(result.head())
Другие расширенияОбработка по частям может значительно снизить потребление памяти, но увеличит время обработки. Выбирайте разумный размер части, чтобы сбалансировать память и время.