Secara default DuckDB akan menggunakan sekitar 80% dari memory yang tersedia, walaupun di prakteknya kadang menggunakan 98% memory yang tersebut, untuk itu perlu dilakukan pembatasan memory menyesuaikan dengan memory yang tersedia di server/komputer/vps anda.
Bila memiliki server dengan memory terbatas, sedangkan file yang akan diproses cukup besar, maka yang diperlukan adalah ruang penyimpanan yang cukup, diutamakan SSD.
SET memory_limit = '4GB';Setelah penggunaan memory sesuai dengan batas yang ditentukan, DuckDB akan mulai menggunakan Swap atau disk filling, konfigurasi yang bisa digunakan
SET temp_directory = '/mnt/ssd1'; SET max_temp_directory_size = '200GB';
Pada konfigurasi diatas, temp_directory atau temporary folder yang akan digunakan oleh DuckDB adalah /mnt/ssd1, bila anda memiliki HD dan/atau SSD, gunakan mount point SSD untuk mempercepat proses pengolahan data. Bila max_temp_directory_size penuh dan memory_limit juga penuh maka query yang dijalankan otomatis dibatalkan, karena tidak ada lagi resource yang bisa digunakan untuk proses pengolahan data.
Contoh error yang bisa muncul
Out of Memory Error: failed to allocate data of size 2.0 MiB (3.7 GiB/3.7 GiB used) Possible solutions: * Reducing the number of threads (SET threads=X) * Disabling insertion-order preservation (SET preserve_insertion_order=false) * Increasing the memory limit (SET memory_limit='...GB')
Setelah melakukan semua optimasi diatas masih belum beerhasil, coba untuk mengubah logic query yang digunakan. Pada satu kasus untuk mengambil data harian dari tabel tertentu, kurang lebih logika yang digunakan
Proses awal:
1. Load data ke tabel temporary
2. Bandingkan data yang ada di tabel master ke tabel temporary
3. Bila ada baris yang menggunakan PK (primary key) yang sama dengan yang ada di tabel master maka update semua kolom, sisanya INSERT
Proses optimasi:
1. Load data ke tabel temporary
2. Bandingkan data yang ada di tabel master ke tabel temporary
3. Bila ada primary key yang sama, hapus dari tabel master
4. INSERT semua data di tabel temporary ke tabel master
Tujuan dari kedua logika tersebut sama, tetapi menggunakan metode yang sedikit berbeda, dengan mengurangi beban query di perbandingan tiap kolom, lebih cepat dengan menghapus data yang memiliki PK yang sama, lalu terakhir INSERT semua data tersebut dari data staging.
Masih banyak area yang bisa di Optimasi untuk Duckdb, salah satu yang banyak digunakan adalah dengan mengconvert CSV menjadi Parquet dengan fitur ROW_GROUP_SIZE. Setelah diubah menjadi parquet baru diproses, keduanya menggunakan duckdb, tetapi dengan memisah keduanya jadi penggunaan memori lebih hemat.