8 ตุลาคม 2558

Published ตุลาคม 08, 2558 by with 0 comment

ปัญหา Stack overflow ในภาษาไพทอน

ปัญหา Stack overflow (ชื่อภาษาไทย ปัญหาสแตกล้น)
คือ ปัญหาที่เกิดจากหน่วยความจำระหว่างเรียกเมท็อดไม่พอ จนเกิดปัญหา Stack overflow หรือปัญหาสแตกล้นขึ้น (อธิบายสั้น ๆ คือ การจองใช้หน่วยความจำจนเต็ม) ปัญหานี้มาจากความผิดพลาดของผู้เขียนโปรแกรมเอง ที่ไม่มีการออกแบบโปรแกรมและตรวจสอบให้ดี

ในภาษาไพทอนเองมีปัญหา Stack overflow เช่นเดียวกันกับภาษาอื่น ๆ (C/C++, JAVA, C# และภาษาอื่น ๆ)

ตัวอย่างโค้ดไพทอนที่มีปัญหา Stack overflow


คำเตือน!
สำหรับการทดลองโค้ดที่มีปัญหา Stack overflow ในภาษาไพทอนนี้ ไม่แนะนำให้เพิ่มจำนวนตัวเลขในคำสั่ง print(deepnesting(100000)) เด็ดขาด เพราะอาจจะทำให้คอมค้างได้ทันทีหลังโค้ดนี้ ทางผู้เขียนไม่รับผิดชอบความเสียหายที่อาจเกิดขึ้นจากการรันโค้ดนี้

def deepnesting(depth):
  r = {}
  for i in range(depth):
    n = {}
    n[i] = r
    r = n
  return r

เมื่อนำโค้ดนี้ไปรันบน CPython จะพบว่า
ปัญหา Stack overflow ในภาษาไพทอน เมื่อรันบน CPython


CPython จะเด้งออกและหยุดการทำงานไปเลย เพราะเราไม่สามารถสร้างข้อมูลชนิด Dict ช้ำกันมากเกินไปได้
หากนำโค้ดนี้ไปลองรันบน PyPy interpreter จะแสดงข้อผิดพลาดออกมา
Traceback (most recent call last):
  File "", line 1, in 
RuntimeError: maximum recursion depth exceeded

แต่ PyPy interpreter กลับยังไม่เด้งออก และยังสามารถทำงานรอรับคำสั่งต่อไปได้ตามปกติ

แนวทางการป้องกันปัญหา Stack overflow


ตรวจเช็คโค้ดไพทอน โครงสร้างโปรแกรม และทำ Test เสมอ
"มีข้อผิดพลาดอย่างน้อยหนึ่งที่ที่ยังหาไม่พบในโปรแกรมเสมอ"

"โปรแกรมที่ไม่มี Bug คือ โปรแกรมที่ยังไม่ได้ถูกเขียน"

แต่ Bug น้อยดีกว่า Bug มากนะครับ

ติดตามบทความต่อไปนะครับ
ขอบคุณครับ

0 ความคิดเห็น:

แสดงความคิดเห็น

แสดงความคิดเห็นได้ครับ :)