1,551 Views
sys.setrecursionlimit()
adalah sebuah fungsi dalam bahasa pemrograman Python yang digunakan untuk mengatur batas kedalaman rekursi saat menggunakan rekursi dalam program. Rekursi adalah sebuah teknik di mana sebuah fungsi memanggil dirinya sendiri secara berulang untuk menyelesaikan tugas tertentu. Fungsi ini biasanya digunakan untuk menghindari terjadinya error “RecursionError: maximum recursion depth exceeded”, yang terjadi ketika rekursi berlanjut terlalu dalam hingga mencapai batas yang telah ditetapkan.
Fungsi sys.setrecursionlimit()
menerima satu parameter, yaitu integer yang menentukan jumlah maksimum panggilan rekursif yang diizinkan sebelum Python menghasilkan error. Tetapi, perlu diingat bahwa mengatur nilai terlalu tinggi juga bisa berisiko karena bisa menyebabkan program mengalami kelebihan penggunaan memori atau bahkan menimbulkan kegagalan program dengan cara yang tidak terduga. Oleh karena itu, pengaturan batas rekursi sebaiknya dilakukan dengan hati-hati dan disesuaikan dengan kebutuhan spesifik dari program yang sedang dibuat.
Penggunaan Fungsi Rekursif untuk Crawler Link Website
Berikut adalah contoh fungsi rekursif dalam Python untuk menelusuri (crawling) link di sebuah website menggunakan modul requests
dan BeautifulSoup
. Fungsi ini akan mengunjungi setiap halaman web dan mengekstrak semua tautan yang ditemukan. Anda perlu menginstal modul tersebut terlebih dahulu jika belum terinstal dengan menjalankan pip install requests beautifulsoup4
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin
def crawl_links(url, visited=None):
if visited is None:
visited = set()
# Memeriksa apakah URL sudah dikunjungi sebelumnya
if url in visited:
return
visited.add(url)
try:
response = requests.get(url)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
# Mencetak URL halaman saat ini
print("Visiting:", url)
# Ekstrak dan cetak semua tautan di halaman saat ini
for link in soup.find_all('a', href=True):
next_link = urljoin(url, link['href'])
print("Found link:", next_link)
crawl_links(next_link, visited) # Rekursif ke tautan berikutnya
except Exception as e:
print("Error:", e)
# Contoh pemanggilan fungsi dengan URL awal
crawl_links('https://www.example.com')
Cara kerja
Dalam kode di atas:
crawl_links()
adalah fungsi rekursif yang mengunjungi setiap halaman web dan mengekstrak semua tautan yang ditemukan.
- Setiap URL yang dikunjungi disimpan dalam set
visited
untuk memastikan tidak ada pengulangan.
- Fungsi akan menghentikan rekursi jika sebuah halaman tidak dapat diakses atau mengalami kesalahan lainnya.
- Modul
requests
digunakan untuk melakukan permintaan HTTP untuk mengakses halaman web.
- Modul
BeautifulSoup
digunakan untuk mengekstrak tautan dari halaman HTML.
- Fungsi
urljoin()
digunakan untuk membangun URL lengkap dari tautan relatif yang ditemukan di halaman web.
SWAP RAM habis out of memory
Adakalanya kita terpaksa menggunakan sebuah function rekursif, terlihat bagus dan ringkas. Namun hali ini mempunyai batasan seperti kapasitas RAM yang digunakan. Fungsi rekursif yang saya pakai untuk keperluan scraping / crawler content ternyata kedalamannya cukup besar. Untuk menaikan set recursion limit, kita bisa menggunakan perintah sys.setrecursionlimit(10_000)
. Namun begitu beban puncak tercapai, memory SWAP pun akan habis, kita bisa cek sudo swapon --show
.hasilnya SWAP RAM dengan kapasitas 4GB pun habis
NAME TYPE SIZE USED PRIO
/swap.img file 4G 4G -2
Beberapa detik lagi, OS nya akan hang/error. Kalian bisa baca https://docs.python.org/3/library/sys.html#sys.setrecursionlimit
Solusinya
Jangan menaikan set recursion limit terlalu tinggi, misalkan pada contoh diatas, kita setting 100_000 alias dinaikan menjadi 10 kali lipat, tentu ini pun percuma karena akan bikin error yaitu RAM habis.
ulimit
Kita bisa menggunakan perintah diatas.ulimit
adalah perintah yang digunakan di sistem operasi Unix dan Unix-like (termasuk Linux) untuk mengatur batasan sumber daya untuk proses yang dijalankan oleh pengguna atau grup. Batasan-batasan ini dapat berupa jumlah maksimum proses yang dapat dibuat, jumlah maksimum file yang dapat dibuka, jumlah maksimum memori yang dapat digunakan, dan lain sebagainya.
Penggunaan ulimit
berguna untuk mengontrol dan membatasi penggunaan sumber daya oleh proses-proses yang berjalan di sistem, sehingga dapat membantu dalam menghindari situasi di mana proses-proses mengonsumsi terlalu banyak sumber daya sistem, yang dapat menyebabkan sistem menjadi tidak responsif atau bahkan kehabisan sumber daya.
Contoh penggunaan ulimit
antara lain:
- Mengatur batasan jumlah file yang dapat dibuka oleh suatu proses.
- Mengatur batasan jumlah memori yang dapat digunakan oleh suatu proses.
- Mengatur batasan jumlah proses yang dapat dibuat oleh suatu pengguna atau grup.
Pengaturan ulimit biasanya dilakukan melalui terminal atau dengan mengedit berkas konfigurasi sistem. Perintah ulimit
juga dapat digunakan untuk menampilkan batasan-batasan yang telah ditetapkan.
Perintah Ulimit bukan untuk menaikan RAM
ulimit
tidak dapat digunakan untuk secara langsung menaikkan RAM atau CPU. ulimit
adalah perintah yang digunakan untuk mengatur batasan sumber daya untuk proses-proses yang berjalan di sistem, tetapi tidak secara langsung memengaruhi kinerja CPU atau jumlah RAM yang tersedia.
Batasi-batasan yang diatur oleh ulimit
termasuk jumlah maksimum memori yang dapat digunakan oleh suatu proses, tetapi ini biasanya digunakan untuk mencegah proses-proses mengonsumsi terlalu banyak memori, bukan untuk meningkatkan jumlah memori yang tersedia bagi proses. Demikian juga, tidak ada opsi dalam ulimit
untuk secara langsung memengaruhi kinerja CPU.
Untuk meningkatkan kinerja CPU atau memori, biasanya Anda harus mempertimbangkan tindakan-tindakan berikut:
- Optimalkan Kode: Pastikan aplikasi Anda efisien dalam penggunaan sumber daya, termasuk CPU dan memori. Ini mungkin melibatkan pemrograman yang lebih efisien, mengurangi beban yang tidak perlu, atau menggunakan algoritma yang lebih efisien.
- Penyetelan Konfigurasi: Terkadang, pengaturan konfigurasi sistem seperti pengaturan kernel atau pengaturan virtual memory (memori virtual) dapat meningkatkan kinerja sistem secara keseluruhan.
- Perbarui Perangkat Keras: Jika memungkinkan, meningkatkan atau mengupgrade komponen perangkat keras seperti CPU atau RAM dapat meningkatkan kinerja secara signifikan.
- Scaling: Membuat aplikasi Anda dapat diskalakan horizontal atau vertikal, sehingga dapat dijalankan pada beberapa instance atau server, mungkin juga merupakan solusi.
- Monitoring dan Tuning: Gunakan alat pemantauan untuk mengidentifikasi bottleneck dan tuning sistem Anda sesuai dengan temuan.
Jadi, untuk meningkatkan kinerja CPU atau memori, Anda perlu mempertimbangkan pendekatan yang lebih luas daripada hanya menggunakan perintah ulimit
.
Sesuai keterangan diatas, yaitu untuk mencegah sebuah proses terlalu banyak mengkonsumsi sumber daya, sehingga walapun set recursion limit tinggi akan dibatasi oleh perintah ulimit.
misalkan perintah berikut
ulimit -s
menghasilkan
8192
Google Colab
Solusi yang saya lakukan yaitu menggunakan google colab saja yang gratisan sudah dapat 12 GB itu full tanpa ada dipakai buat OS, berbeda jika kita punya RAM sebesar itu pasti sudah berkurang banyak karena dipakai oleh OS. Berikut tampilan ketika melakukan scraping website
