Fungsi Rekursif untuk Crawler Link Website dan Set Recursion Limit

By | February 17, 2024
Print Friendly, PDF & Email
1,356 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

See also  OMP - Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.

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.

See also  Seberapa Cepat C++ Dibandingkan dengan Python?

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:

  1. 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.
  2. Penyetelan Konfigurasi: Terkadang, pengaturan konfigurasi sistem seperti pengaturan kernel atau pengaturan virtual memory (memori virtual) dapat meningkatkan kinerja sistem secara keseluruhan.
  3. Perbarui Perangkat Keras: Jika memungkinkan, meningkatkan atau mengupgrade komponen perangkat keras seperti CPU atau RAM dapat meningkatkan kinerja secara signifikan.
  4. Scaling: Membuat aplikasi Anda dapat diskalakan horizontal atau vertikal, sehingga dapat dijalankan pada beberapa instance atau server, mungkin juga merupakan solusi.
  5. Monitoring dan Tuning: Gunakan alat pemantauan untuk mengidentifikasi bottleneck dan tuning sistem Anda sesuai dengan temuan.
See also  Membuat API menggunakan Flask

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

 

Leave a Reply