Kezdők útmutatója a nagy adathalmazok kezeléséhez Pythonban

Gyakori rémálom, amikor megpróbálsz betölteni egy nagy fájlt Pandasban és a géped lefagy. A RAM megtelik, a program összeomlik. Ez azért történik, mert alapértelmezésben a rendszer mindent egyszerre próbál a memóriába zsúfolni. Szerencsére nem kell drága hardver vagy profi tudás a megoldáshoz. Néhány egyszerű trükkel a saját laptopodon is feldolgozhatsz több gigabájtos fájlokat. Ebben a cikkben hét bevált technikát mutatunk be, a legegyszerűbbtől a haladó eszközökig.

1. Olvasás darabokban (Chunking)

A legegyszerűbb módszer, ne edd meg az egész tortát egyszerre! A chunksize paraméterrel megmondhatod a Pandasnak, hogy egyszerre csak meghatározott számú sort töltsön be.

Példa: Teljes bevétel kiszámítása

import pandas as pd

# Egyszerre csak 100 000 sort töltünk be
chunk_size = 100000
total_revenue = 0

# A fájl feldolgozása darabokban
for chunk in pd.read_csv('large_sales_data.csv', chunksize=chunk_size):
    # Minden darabon elvégezzük a számítást
    total_revenue += chunk['revenue'].sum()

print(f"Teljes bevétel: ${total_revenue:,.2f}")

Így a memóriádban mindig csak 100 000 sor van, még akkor is, ha a fájl 10 millió soros.

2. Csak a szükséges oszlopok betöltése

Gyakran nincs szükséged az összes adatra. Ha egy 50 oszlopos táblából csak kettővel dolgozol, feleslegesen terheled a gépedet a többivel.

Példa: Memória spórolás a usecols használatával

import pandas as pd

# Csak azt töltsd be, amire szükséged van
columns_to_use = ['customer_id', 'age', 'purchase_amount']

df = pd.read_csv('customers.csv', usecols=columns_to_use)

# A számítás ugyanúgy működik, de sokkal kevesebb memóriát használ
average_purchase = df.groupby('age')['purchase_amount'].mean()
print(average_purchase)

Ezzel akár 90%-kal is csökkentheted a memóriaigényt.

3. Adattípusok optimalizálása

A Pandas alapértelmezésben „biztonsági játékot” játszik, és nagyobb adattípusokat használ a kelleténél (pl. 64 bites egészeket). Ha tudod, hogy az értékeid kicsik, válts kisebb típusra.

Példa: 8-szoros tömörítés

import pandas as pd

df = pd.read_csv('ratings.csv')

# Memória optimalizálás
# Az értékelés 1-5 skálán van, felesleges a 64 bit, elég a 8 is
df['rating'] = df['rating'].astype('int8')
df['user_id'] = df['user_id'].astype('int32') 

print(df.memory_usage(deep=True))

Gyakori konverziók:

  • int64 -> int8, int16
  • float64 -> float32

4. Kategória típus használata

Ha egy szöveges oszlopban sokszor ismétlődnek ugyanazok az értékek (pl. országok, termékkategóriák), használd a category típust. Így a Pandas nem tárolja le milliószor a „Magyarország” szót, csak egy kódot használ helyette.

import pandas as pd

df = pd.read_csv('products.csv')

# Átalakítás kategóriává
df['category'] = df['category'].astype('category')

# Ugyanúgy működik, mint a szöveg, de sokkal kisebb helyet foglal
print(df['category'].value_counts())

5. Szűrés beolvasás közben

Miért töltenél be mindent, ha utána úgyis eldobod a felét? Kombináld a darabolást (1. pont) a szűréssel.

Példa: Csak a 2024-es adatok betöltése

import pandas as pd

chunk_size = 100000
filtered_chunks = []

for chunk in pd.read_csv('transactions.csv', chunksize=chunk_size):
    # Szűrés még a memóriában való tárolás előtt
    filtered = chunk[chunk['year'] == 2024]
    filtered_chunks.append(filtered)

# A szűrt darabok egyesítése
df_2024 = pd.concat(filtered_chunks, ignore_index=True)

6. Dask: Párhuzamos feldolgozás

Ha az adathalmaz tényleg hatalmas, és a fenti trükkök nem elegek, jöhet a nehéztüzérség. A Dask olyan, mint a Pandas, de automatikusan kezeli a darabolást és több processzormagot használ.

import dask.dataframe as dd

# A Dask automatikusan darabol
df = dd.read_csv('huge_dataset.csv')

# Lusta kiértékelés: csak a .compute() híváskor számol
result = df['sales'].mean()
average_sales = result.compute()

print(f"Átlagos bevétel: ${average_sales:,.2f}")

7. Mintavételezés a fejlesztéshez

Amíg csak írod a kódot vagy teszteled a modellt, felesleges a teljes adatbázissal dolgozni. Tölts be csak egy mintát!

import pandas as pd
import random

# 1. módszer: Az első 50 000 sor
df_head = pd.read_csv('huge_dataset.csv', nrows=50000)

# 2. módszer: Véletlenszerű minta (kb. 1%)
skip_rows = lambda x: x > 0 and random.random() > 0.01
df_random = pd.read_csv('huge_dataset.csv', skiprows=skip_rows)

Összefoglaló táblázat

Melyik módszert mikor érdemes használnod? Íme a segítség:

TechnikaMikor használd?
Darabolás (Chunking)Ha aggregálni (összeadni, átlagolni) kell, és nem fér a RAM-ba.
OszlopkiválasztásHa a táblázat széles, de csak pár adat kell belőle.
Típus optimalizálásMindig. Betöltés után azonnal érdemes elvégezni.
Kategória típusIsmétlődő szöveges értékeknél (pl. ország, megye).
Szűrés beolvasáskorHa csak az adatok egy részhalmaza érdekel.
DaskHa a fájl óriási, és párhuzamos feldolgozás kell.
MintavételezésFejlesztés, tesztelés és felfedezés közben.

Kezdd a chunksize és a usecols használatával, ezek a legtöbb problémát megoldják. Ha pedig kinövöd a Pandast, a Dask készen áll.

Kérjük, ellenőrizd a mező formátumát, és próbáld újra.
Köszönjük, hogy feliratkoztál.

vagyunk.hu hírlevél

Hozzászólás

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük