Cara Menghemat Memori DataFrame Pandas (Turun Sampai 70%)
TL;DR
Cara paling ampuh menghemat memori DataFrame Pandas ada tiga: downcast kolom angka dari int64 ke tipe yang lebih kecil kayak int8 atau int16, ubah kolom teks berulang jadi tipe category, dan baca file dengan tipe data yang tepat sejak awal lewat parameter dtype di read_csv. Kombinasi ini rutin nurunin ukuran DataFrame 50 sampai 70 persen tanpa ngubah isinya. Langkah pertama selalu cek dulu pemakaian memori pakai df.info(memory_usage='deep') biar tahu kolom mana yang paling rakus.
Cara paling ampuh menghemat memori DataFrame Pandas ada tiga: downcast kolom angka ke tipe yang lebih kecil, ubah kolom teks berulang jadi category, dan set tipe data yang tepat sejak baca file. Kombinasi ketiganya rutin nurunin ukuran 50 sampai 70 persen.
DataFrame yang bikin laptop lemot atau muncul MemoryError biasanya bukan karena datanya kegedean. Sering karena Pandas milih tipe data yang boros secara default. Kolom umur disimpan pakai int64 yang muat sampai triliunan, kolom kota disimpan sebagai string berulang.
Di bawah ini langkahnya dari cek memori sampai baca file besar dengan hemat, plus satu kasus nyata nurunin file 780 MB jadi 210 MB.
Gimana cara cek pemakaian memori DataFrame?
Sebelum ngoptimasi, kamu harus tahu kolom mana yang paling rakus. Pandas punya dua cara ngecek, dan yang penting pakai argumen deep biar hitungannya akurat buat kolom teks.
import pandas as pd
df = pd.read_csv("penjualan_umkm.csv")
# Total memori plus tipe tiap kolom
df.info(memory_usage="deep")
# Angka per kolom dalam byte
print(df.memory_usage(deep=True))
Tanpa deep=True, Pandas cuma ngitung pointer buat kolom teks, bukan isi string-nya. Angkanya jadi keliatan kecil padahal aslinya besar. Selalu pakai deep buat gambaran jujur.
Dari output ini kamu bisa lihat kolom mana yang bertipe int64, float64, atau object. Tiga tipe itu yang paling sering bisa dikecilin. Konsep dasar DataFrame ada di glossary DataFrame.
Gimana cara downcast kolom angka?
Downcast itu ngubah kolom angka ke tipe yang lebih kecil tapi masih cukup nampung nilainya. Kolom yang isinya 0 sampai 100 nggak butuh int64. Diubah ke int8 aja cukup, dan ukurannya jadi seperdelapan.
Ini tabel batas tiap tipe integer biar kamu tahu mana yang aman dipakai.
| Tipe | Rentang nilai | Ukuran |
|---|---|---|
| int8 | -128 sampai 127 | 1 byte |
| int16 | -32.768 sampai 32.767 | 2 byte |
| int32 | sekitar 2 miliar | 4 byte |
| int64 | sangat besar | 8 byte |
Cara paling gampang pakai pd.to_numeric dengan argumen downcast. Pandas otomatis milih tipe terkecil yang muat.
# Downcast otomatis ke integer terkecil yang muat
df["umur"] = pd.to_numeric(df["umur"], downcast="integer")
# Downcast kolom desimal ke float lebih kecil
df["harga"] = pd.to_numeric(df["harga"], downcast="float")
Buat float, hati-hati sedikit. Downcast float64 ke float32 ngurangin presisi desimal. Buat data uang atau ilmiah yang butuh presisi tinggi, biarin float64. Detail konversi tipe aku bahas juga di pandas astype.
Kapan pakai tipe category?
Kolom teks yang nilainya berulang dan variasinya sedikit itu kandidat terbaik buat category. Kolom kota, kategori produk, status pesanan. Pandas nyimpen daftar nilai unik sekali, lalu pakai kode angka buat sisanya.
# Cek dulu berapa nilai unik dibanding total baris
print(df["kota"].nunique(), "dari", len(df))
# Kalau nilai uniknya sedikit, ubah jadi category
df["kota"] = df["kota"].astype("category")
df["kategori"] = df["kategori"].astype("category")
Aturan praktisnya: kalau jumlah nilai unik kurang dari sekitar setengah total baris, category biasanya hemat. Kalau nilainya hampir semua unik kayak kolom ID atau email, jangan pakai category, malah lebih boros karena harus nyimpen daftar dan kode sekaligus.
Gimana cara hemat memori waktu baca CSV besar?
Optimasi paling efektif dilakukan sejak baca file, bukan setelah semua data masuk RAM. Ada tiga senjata di read_csv.
Pertama, usecols buat baca cuma kolom yang kamu butuh. Buat apa muat 30 kolom kalau analisismu cuma pakai 5.
# Baca cuma kolom yang dipakai
df = pd.read_csv(
"penjualan_umkm.csv",
usecols=["tanggal", "kota", "kategori", "qty", "harga"]
)
Kedua, dtype buat kasih tahu tipe data sejak awal biar Pandas nggak default ke int64 dan object.
# Tentuin tipe data sejak baca
df = pd.read_csv(
"penjualan_umkm.csv",
dtype={
"qty": "int16",
"kota": "category",
"kategori": "category",
},
parse_dates=["tanggal"]
)
Ketiga, kalau filenya kegedean buat RAM sekaligus, baca bertahap pakai chunksize. Kamu proses per potongan lalu gabung hasilnya. Teknik baca file dasar aku bahas di pandas read_csv dan referensi fungsi read_csv.
# Proses file besar per 100 ribu baris
total_qty = 0
for chunk in pd.read_csv("penjualan_umkm.csv", chunksize=100_000):
total_qty += chunk["qty"].sum()
print(total_qty)
Contoh kasus: file penjualan UMKM 2 juta baris
Aku pegang file penjualan_umkm.csv berisi 2 juta baris transaksi gabungan dari beberapa toko. Semua angka di bawah dari dataset ngulikdata. Waktu dibaca polos tanpa optimasi, ukurannya di memori 780 MB. Laptop 8 GB langsung berat.
Aku cek pakai info, ketahuan biang borosnya. Kolom kota dan kategori disimpan sebagai object, padahal masing-masing cuma punya belasan nilai unik. Kolom qty pakai int64 padahal isinya di bawah 500.
Setelah aku terapin tiga langkah tadi, hasilnya begini.
| Langkah | Ukuran memori | Penghematan |
|---|---|---|
| Baca polos | 780 MB | - |
| Downcast angka | 560 MB | 28% |
| Kota dan kategori jadi category | 260 MB | 67% |
| Buang kolom nggak kepakai | 210 MB | 73% |
Dari 780 MB jadi 210 MB, turun 73%. Isinya sama persis, nggak ada baris atau nilai yang hilang. Yang berubah cuma cara Pandas nyimpennya. Setelah itu, operasi groupby yang tadinya bikin kernel mati jadi jalan mulus.
Pelajaran terbesarnya: yang paling hemat bukan downcast angka, tapi ubah kolom teks berulang jadi category. Dua kolom itu doang nyumbang penghematan terbesar.
Kesalahan umum
Downcast tanpa cek batas nilai. Ngubah kolom ke int8 padahal ada nilai di atas 127 bikin data rusak diam-diam. Cek dulu nilai maksimal dan minimal sebelum downcast.
Pakai category buat kolom ID. Kolom yang hampir semua nilainya unik malah lebih boros pakai category. Simpan sebagai string atau angka biasa.
Downcast float uang ke float32. Presisinya berkurang dan hitungan rupiah bisa meleset di desimal. Buat angka uang, biarin float64 atau pakai integer dalam satuan sen.
Optimasi setelah semua data masuk RAM. Kalau filenya udah nggak muat, optimasi setelah baca itu telat. Set dtype dan usecols sejak read_csv.
Lupa deep=True waktu cek memori. Tanpa itu, kolom teks keliatan kecil dan kamu salah nebak kolom mana yang perlu dioptimasi.
FAQ
Gimana cara cek pemakaian memori DataFrame Pandas?
Pakai df.info(memory_usage='deep') buat lihat total dan tipe tiap kolom, atau df.memory_usage(deep=True) buat angka per kolom dalam byte. Argumen deep=True penting buat kolom teks, karena tanpa itu Pandas cuma ngitung pointer, bukan isi string sebenarnya. Dari sini kamu tahu kolom mana yang paling rakus dan layak dioptimasi duluan.
Apa itu downcast di Pandas?
Downcast adalah ngubah kolom angka ke tipe data yang lebih kecil tapi masih cukup nampung nilainya. Kolom umur yang isinya 0 sampai 120 nggak butuh int64 yang muat sampai triliunan. Diubah ke int8 aja cukup, dan ukurannya jadi seperdelapan. Kamu bisa pakai pd.to_numeric dengan argumen downcast, atau astype langsung ke tipe yang kamu tentuin.
Kapan sebaiknya pakai tipe category di Pandas?
Pakai category buat kolom teks yang nilainya berulang-ulang dan variasinya sedikit, kayak kolom kota, kategori produk, atau status. Kalau satu kolom punya 100 ribu baris tapi cuma 5 nilai unik, category nyimpen 5 nilai itu sekali lalu pakai kode angka buat sisanya. Hematnya besar. Tapi jangan pakai buat kolom yang hampir semua nilainya unik kayak ID.
Apakah optimasi memori bikin data saya berubah?
Nggak, selama kamu downcast ke tipe yang masih muat semua nilai. Ngubah int64 jadi int16 aman kalau nilai maksimalnya di bawah batas int16. Yang perlu hati-hati itu float. Downcast float64 ke float32 ngurangin presisi desimal, jadi buat perhitungan uang atau ilmiah yang butuh presisi tinggi, biarin float64. Selalu cek ulang beberapa nilai setelah konversi.
Gimana cara hemat memori waktu baca CSV besar?
Ada tiga trik utama. Pakai parameter usecols buat baca cuma kolom yang kamu butuh. Pakai dtype buat kasih tahu tipe data tiap kolom sejak awal biar Pandas nggak default ke int64 dan object. Kalau filenya kegedean buat RAM, baca bertahap pakai chunksize, proses per potongan, lalu gabung hasilnya. Kombinasi ini bikin file yang tadinya nggak muat jadi bisa diproses.
Penutup
Yang perlu kamu bawa soal hemat memori Pandas:
- Cek dulu pakai df.info(memory_usage='deep') biar tahu kolom mana yang rakus
- Downcast angka dan ubah teks berulang jadi category, dua ini yang paling ngefek
- Set dtype dan usecols sejak read_csv buat file yang gede banget
Coba jalanin info memory di DataFrame kamu sekarang, terus ubah satu kolom teks berulang jadi category. Lihat berapa turunnya. Buat pendalaman tipe data, lanjut ke fungsi astype, dan referensi resmi ada di dokumentasi Pandas soal skala data.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel terkait
NumPy reshape: Ubah Bentuk Array (2026)
Fungsi reshape di NumPy ngatur ulang bentuk array tanpa ngubah datanya. Ini cara pakainya, arti angka -1, dan cara ngeflat array.
NumPy Array: Dasar-Dasar untuk Analis Data (2026)
NumPy array bikin hitungan data di Python jauh lebih cepat dari list biasa. Ini dasar bikin, slicing, dan operasi array buat analis.
Alternatif iterrows yang Lebih Cepat di Pandas
iterrows nyaman ditulis tapi lambat. Ini urutan alternatif iterrows di pandas dari yang tercepat, plus benchmark biar kamu tau kapan pakai yang mana.