Cara menangani dataset yang besar

By | February 1, 2022
1,453 Views

Sebagai data scientist akan seringkali akan banyak berurusan dengan big data. Apa yang saya sebut big data secara kasar sesuai dengan dataset tidak terlalu besar tapi cukup membuat komputer kesulitan memprosesnya dan benar-benar memperlambat semuanya. Ada beberapa cara menangani dataset yang besar alih-alih menggunakan tools lain.

1. Pengurangan Memory dengan menentukan data type yang tepat

Saat menggunakan Pandas untuk memuat data dari file. Maka Pandas akan secara otomatis menyimpulkan tipe data kecuali diberitahu sebaliknya. Sebagian besar waktu ini akan berfungsi dengan baik tetapi tipe yang disimpulkan belum tentu dioptimalkan. Selain itu, jika kolom numerik berisi nilai yang hilang dari tipe yang disimpulkan secara otomatis akan mengambang/float. Jadi pastikan kalian sedari awal untuk memberikan argument input yang jelas sesuai dengan data type nya.

Untuk kasus tertentu, menentukan tipe data akan mengurangi penggunaan memori. Harap perhatikan bahwa dalam contoh di atas saya menggunakan tipe pandas pandas.Int16Dtype untuk memaksa kolom yang berisi nilai yang hilang menjadi tipe int. Ini dicapai secara internal dengan menggunakan pandas.NA daripada  numpy.nan untuk menangani missing value.

2. Split data kedalam chunks

Ketika data terlalu besar untuk dimasukkan ke dalam memori, kalian dapat menggunakan opsi chunksize Pandas untuk membagi data menjadi beberapa bagian daripada berurusan dengan satu blok besar. Menggunakan opsi ini membuat objek iterator yang dapat digunakan untuk menelusuri potongan yang berbeda dan melakukan pemfilteran atau analisis seperti yang akan dilakukan saat memuat dataaset lengkap.

Berikut adalah contoh penggunaan opsi ini untuk menelusuri dataset Yelp, mengekstrak tanggal ulasan minimum dan maksimum untuk setiap bagian, dan kemudian membangun kembali rentang waktu lengkap untuk ulasan:

reader = pd.read_json(reviews_path, lines=True, orient = "records", chunksize = 100000)

# go through the chunks and extract min/max date
date_limits = []
for chunk in reader:
    
    date_limits.append(max(chunk.date))
    date_limits.append(min(chunk.date))
    
print("Reviews span from {} to {}".format(min(date_limits).strftime('%d-%m-%Y'),
                                          max(date_limits).strftime('%d-%m-%Y')))

3. lazy evaluation

Lazy evaluation mengacu pada strategi yang menunda evaluasi ekspresi sampai nilai benar-benar dibutuhkan. Lazy evaluation adalah konsep penting (digunakan terutama dalam pemrograman fungsional), dan jika kalian ingin membaca lebih lanjut tentang penggunaan lazy evaluation bisa pelajari disini.

See also  Mencoba Google Colab Pro

Lazy Evaluation  biasanya digunakan pada komputasi terdistribusi seperti Spark atau Dask dibangun. Meskipun dirancang untuk bekerja pada klaster, kalian masih dapat memanfaatkannya untuk menangani dataset besar di komputer.

Perbedaan utama loading dataset dengan Pandas adalah bahwa lazy evaluasi tidak memuat data secara langsung di memori. Maka lazy evaluasi bekerja dengan cara memindai data, menyimpulkan tipe-tipe dan membaginya menjadi beberapa partisi. Grafik komputasi dibuat untuk partisi ini secara independen dan dijalankan hanya jika benar-benar dibutuhkan.

Misalkan kalian punya ram hanya 8Gb sedangkan ukuran file yang akan diload sebesar 10Gb, tentu bila menggunakan Pandas akan sangat merepotkan. Kalian bisa menggunakan Pyspark untuk melakukan analisis eksplorasi pada kumpulan data yang lebih besar dari memori. Dask juga cukup populer dan contohnya tidak sulit ditemukan. Sintaks Dask meniru Pandas sehingga akan terlihat familier, namun terbatas pada penggunaan Python, sementara Spark juga akan bekerja di Java atau Scala.