Slutt å krasje Python-skriptene dine: Hvordan håndtere massive datasett på hvilken som helst laptop


Jeg startet et klimamodelleringsprosjekt med antakelsen om at jeg skulle håndtere «store» datasett. Så så jeg den faktiske størrelsen: 2 terabyte. Jeg skrev et enkelt NumPy-skript, kjørte det, og tok en kaffe. Dårlig idé. Da jeg kom tilbake, hadde maskinen min fryst. Jeg startet på nytt og prøvde et mindre utsnitt. Samme krasj. Min vanlige arbeidsflyt ville ikke fungere. Etter litt prøving og feiling landet jeg til slutt på Zarr, et Python-bibliotek for lagring av oppdelte matriser. Det lot meg behandle hele 2TB-datasettet på laptopen min uten krasj. Her er hva jeg lærte:

Når «big data» egentlig betyr store problemer

Å jobbe med terabyte er ikke bare «mer data.» Det er en helt annen type problem som bryter alle de vanlige antagelsene dine.

De fleste bærbare datamaskiner har 16 til 32 GB RAM. En enkelt terabyte er omtrent 1 000 GB. Du kan rett og slett ikke laste det inn i minnet, uansett hvor smart koden din er. Selv om du på en eller annen måte kunne få plass til det, er sekvensielle lesinger i dette omfanget smertefullt trege.

De vanlige løsningene har alle alvorlige ulemper. Du kunne leie en skyserver med mye minne og hundrevis av gigabyte RAM, men det blir raskt dyrt, og personlig oppgradering av RAM på din lokale maskin er ikke lenger et kostnadseffektivt alternativ. RAM-prisene har omtrent tredoblet seg siden midten av 2025 på grunn av at AI-datasentre bruker mesteparten av forsyningen.

Den 64GB-oppgraderingen som kostet 200 dollar i fjor vår, koster nå over 700 dollar. Databaser fungerer veldig bra for tabulære data, men føles klønete for flerdimensjonale matriser. Å dele filer manuelt i håndterbare deler fungerer helt til du trenger å oppdatere noe, da blir det et skjøre rot.

Jeg trengte noe spesiallaget for array-operasjoner som ikke krevde dyre maskinvareoppgraderinger. Enda viktigere, jeg trengte samarbeidspartnere som kunne få tilgang til resultatene på sine vanlige maskiner uten å måtte laste ned terabyte med filer først.

Møt Zarr (endelig, noe som er designet for dette)



Zarr er et Python-bibliotek laget for lagring av store, delt opp matriser. Hovedideen er vakkert enkel: del matriser inn i uavhengige lagrede biter. Hver bit kan komprimeres på egen hånd og leses separat fra resten. Du samhandler med en Zarr-matrise nesten på samme måte som med en NumPy-matrise, med kjent slicing og indekseringssyntaks. Men under panseret laster Zarr bare inn de bitene du faktisk trenger i minnet.

Biblioteket støtter lokale disker, nettverksstasjoner og skylagringstjenester som S3, Google Cloud Storage eller Azure Blob. Dette gjorde det mulig å behandle data som ligger i skyen uten å laste ned alt først. For et datasett på 2 TB var denne funksjonaliteten alene banebrytende.

Zarr er åpen kildekode, aktivt vedlikeholdt av det vitenskapelige Python-miljøet, og fungerer godt med det eksisterende økosystemet. API-en føles kjent, ikke som å lære et helt nytt system. Hvis du kjenner NumPy, er du allerede godt på vei.

Setter det på prøve med ekte data

Mitt testdatasett var på omtrent 2 TB med klimamodelleringsresultater som spente over tusenvis av tidssteg. Målet var enkelt: å beregne regionale gjennomsnitt over hele tidsserien. Jeg satte opp et Zarr-array med nøye utvalgte chunk-størrelser. Dette krevde litt eksperimentering. Chunks som er for små, tilfører overhead fra håndtering av for mange filer. Chunks som er for store, motvirker hensikten ved å tvinge deg til å laste gigabyte inn i minnet samtidig.

Jeg endte til slutt opp med å bruke biter som samsvarte med mine tilgangsmønstre, delt opp etter tid og geografisk område. Den faktiske koden så bemerkelsesverdig lik ut som min originale NumPy-skript:

import zarr
import numpy as np
# Create a chunked Zarr array
store = zarr.DirectoryStore('climate_data.zarr')
z = zarr.open(store, mode='w', shape=(10000, 1000, 2000), 
              chunks=(100, 500, 500), dtype='float32')
# Write data in chunks
for i in range(100):
    chunk_data = process_raw_data(i)
    z[i*100:(i+1)*100] = chunk_data
# Read and process specific slices
regional_avg = z[:, 200:300, 500:600].mean(axis=0)

Den første fullstendige kjøringen ble fullført vellykket på noen timer. Min bærbare datamaskins minnebruk holdt seg rundt 4 GB hele tiden. Ingen krasj, ingen frysing, bare jevn fremgang gjennom datasettet.

Zarr-funksjonene som faktisk betydde noe

Kompresjon var overraskende effektiv uten noen justeringer. Zarr bruker Blosc som standard, noe som reduserte mitt 2 TB dataset til under 400 GB. For vitenskapelige data med mønstre og repetisjon er kompresjonsforhold som dette vanlig. Delvise lesinger gjorde utforskende analyse mulig. Jeg kunne laste inn bare januar-data, eller bare en spesifikk region, uten å berøre resten. Det som tidligere var umulig, ble rutine.

Støtte for skylagring eliminerer flaskehalser på lokale disker. Jeg flyttet den siste matrisen til Google Cloud Storage. Samarbeidspartnere kunne åpne den direkte uten nedlastinger, og jeg sluttet å bekymre meg for sikkerhetskopieringsstrategier for multi-terabyte filer.

Parallellskriving lar meg dele behandling på tvers av flere skript eller maskiner. Ulike prosesser kunne skrive til separate deler samtidig uten konflikter. Dette forvandlet en fler-dagers sekvensiell jobb til noe jeg kunne fullføre på timer. Til slutt endret arbeidsflyten min seg. I stedet for «behandle alt, og deretter lagre», gikk jeg over til «behandle og lagre trinnvis». Zarr fungerer like godt for å bygge arrays bit for bit som for å lese dem tilbake.

Der Zarr får deg til å jobbe litt hardere

Til tross for sine mange fordeler, er ikke Zarr uten kompromisser. Du må fortsatt tenke nøye på størrelsen på kubene og tilgangsmønstre. Dårlige valg kan gjøre små arbeidsmengder tregere enn vanlig NumPy. Tung tilfeldig tilgang på tvers av mange kuber er kostbart. Hvis du stadig hopper rundt på en uforutsigbar måte, vil du måtte betale prisen for å laste ulike kuber gjentatte ganger. Noen problemer krever at du tenker på nytt om tilnærmingen din.

Det er en ekte læringskurve når det gjelder ytelsesoptimalisering.

Dokumentasjonen er solid, men spredt mellom Zarr, Xarray for merkede matriser, og Dask for parallell databehandling. Det tar tid å finne ut hvilket verktøy som håndterer hva. I praksis fungerer Zarr ofte best sammen med Dask for parallelle operasjoner eller Xarray for dimensjonsetiketter. Overlappet mellom verktøyene kan være forvirrende for nybegynnere. For min arbeidsmengde, som mest handlet om sekvensiell tilgang og regionale aggregasjoner, var kompromissene absolutt verdt det. Men hvis problemet ditt allerede passer komfortabelt i RAM, bør du holde deg til NumPy.

Zoom ut: Hvorfor dette endret min vanlige arbeidsflyt

Zarr er ikke den eneste løsningen. HDF5 har eksistert lenger. TileDB retter seg mot lignende problemer med andre designvalg. NetCDF4 er fortsatt standard innen klimavitenskap. Det som gjorde Zarr spesielt, var hvor naturlig det passet inn i Python-økosystemet. Xarray legger til dimensjonsetiketter og koordinatsystemer, og Dask legger til parallellisering og distribuert databehandling. Delene kobles sammen sømløst.

Å jobbe i terabyte-skala føltes ikke lenger uvanlig, og jeg går som standard til Zarr når datasett overstiger noen få gigabyte, selv om de teknisk sett får plass i RAM. Bare bekvemmeligheten med komprimering og skylagring gjør det verdt det. Den vitenskapelige Python-stacken har modnet til en seriøs plattform for big data. Du trenger ikke Hadoop eller Spark for array-arbeidsmengder lenger.


Zarr lagret prosjektet og sparte sannsynligvis min fornuft. Det som føltes umulig på laptopen min, ble håndterbart. Hvis du jobber med store matriser og stadig treffer minnebegrensninger, er Zarr verdt å utforske. Læringskurven lønner seg raskt, spesielt med tanke på at dagens RAM-priser gjør maskinvareoppgraderinger uforholdsmessig dyre.

Start med den offisielle Zarr-dokumentasjonen og eksperimenter med chunking-strategier på mindre datasett først. Du kan starte smått og skalere opp etter behov uten å måtte skrive alt på nytt. Når du blir komfortabel med det grunnleggende, åpner det bredere økosystemet rundt Xarray og Dask opp for enda flere muligheter.

Relaterte artikler