8 ตุลาคม 2558

Published 10/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)) เด็ดขาด เพราะอาจจะทำให้คอมค้างได้ทันทีหลังโค้ดนี้ ทางผู้เขียนไม่รับผิดชอบความเสียหายที่อาจเกิดขึ้นจากการรันโค้ดนี้


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

print(deepnesting(100000))
[/python]

เมื่อนำโค้ดนี้ไปรันบน CPython จะพบว่า

[caption id="attachment_1506" align="aligncenter" width="760"]ปัญหา Stack overflow ในภาษาไพทอน เมื่อรันบน CPython ปัญหา Stack overflow ในภาษาไพทอน เมื่อรันบน CPython[/caption]

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 ความคิดเห็น:

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

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