ไฟล์ JSON ใหญ่แค่ไหนที่เบราว์เซอร์รับได้
สรุปสำคัญ: ไม่มีขีดจำกัดตายตัว; ข้อจำกัดคืองบหน่วยความจำของแท็บ ไฟล์ 20MB มักกลายเป็น 60–100MB เมื่อ parse แล้ว และ DOM ที่ไฮไลต์อาจทำให้เพิ่มเป็นสองเท่าอีกครั้ง

สรุปสั้น ๆ: ไม่มีเพดานตายตัว — ประเมินจากหน่วยความจำ เพราะ object ที่ parse แล้วมักกิน 3–5 เท่าของขนาดข้อความ และ DOM ที่ไฮไลต์ทำให้เพิ่มอีกเท่าตัว; เกิน 50MB หรือเมื่อจำนวน record ระดับบนสุดเข้าสู่หลักแสน ให้ตัดแบ่ง stream หรือเปลี่ยนไปใช้แอปในเครื่องแทนการฝืนในแท็บ
หน่วยความจำไปอยู่ที่ไหน
ข้อความ JSON ขนาด 20MB มีอยู่สามชุด:
- สตริงดิบ: 20MB
- กราฟ object ที่ parse แล้ว: มัก 60–100MB (สตริงซ้ำ, header ของ object, hash table)
- DOM ที่ไฮไลต์: หนึ่ง node ต่อ token เพิ่มได้อีก 2 เท่าง่าย ๆ
Buffer ของ editor, undo stack และ cache ของ syntax highlight เป็นของเพิ่ม "ไฟล์ 20MB" อาจกิน resident เกิน 200MB
กฎคร่าว ๆ
| ขนาด | เดสก์ท็อป | มือถือ |
|---|---|---|
| < 5MB | ลื่นไหล | ลื่นไหล |
| 5–20MB | กระตุกเล็กน้อย ใช้ 1–3 วินาทีในการ format | กระตุกชัดเจน อาจค้าง |
| 20–50MB | ใช้ได้แต่หนัก; ปิดการไฮไลต์ | มีแนวโน้ม crash |
| > 50MB | ไม่แนะนำ | ใช้ไม่ได้ |
ค่าเหล่านี้เปลี่ยนตามอุปกรณ์ เวอร์ชันเบราว์เซอร์ และการเปิดไฮไลต์หรือไม่ ใช้เป็นหลักบอกขนาดคร่าว ๆ ไม่ใช่การรับประกัน
ทำไมเพิ่ม RAM ไม่ช่วย
แท็บมีเพดานตายตัว เกินแล้วจะ crash ทันทีแทนที่จะลดประสิทธิภาพอย่างนุ่มนวล มือถือเข้มงวดกว่านั้นอีก คือคืนหน่วยความจำในระดับไม่กี่ร้อยเมกะไบต์
การทำงานกับไฟล์ขนาดใหญ่
ตัดแบ่ง
head -c 1048576 big.json | jq .
jq '.items[0:100]' big.json
Stream stream-json, ijson, jq --stream ประมวลผลทีละ record โดยหน่วยความจำไม่ขึ้นกับขนาดไฟล์
ใช้แอปในเครื่อง ไม่มีเพดานแท็บ ใช้หน่วยความจำของเครื่องเต็มที่: ดาวน์โหลดเดสก์ท็อป
เปลี่ยนรูปแบบ Log และ event stream ควรเป็น NDJSON ตั้งแต่ต้น — หนึ่ง record ต่อบรรทัด stream ได้โดยธรรมชาติ
ขอให้ backend ลดข้อมูล ถ้า UI ต้องการสามฟิลด์ การส่งสามร้อยฟิลด์เป็นปัญหาการออกแบบ API ไม่ใช่ข้อจำกัดของเบราว์เซอร์
ประเมินขนาดไฟล์
ls -lh data.json
jq 'length' data.json
ถ้า length อยู่ในหลักแสน คำตอบคือ pagination หรือ streaming ไม่ว่าจะมีขนาดกี่ไบต์
คำถามที่พบบ่อย
จะรู้ได้อย่างไรว่าไฟล์ของฉันอยู่ในช่วงขนาดไหน?
ตรวจไบต์ด้วย ls -lh และจำนวน record ระดับบนสุดด้วย jq 'length' ไฟล์ต่ำกว่าสองสามเมกะไบต์ลื่นไหลทุกที่, 20–50MB ใช้ได้บนเดสก์ท็อปแต่กระตุก และเกิน 50MB ควร stream หรือใช้เครื่องมือ command line
ควรทำอย่างไรกับไฟล์ที่เกิน 50MB?
ตัดแบ่งด้วย head -c หรือ stream ด้วย jq, stream-json หรือ jq --stream เพื่อให้หน่วยความจำไม่ขึ้นกับขนาดไฟล์ ถ้าต้องตรวจทั้งเอกสาร ให้ใช้แอปเดสก์ท็อปซึ่งไม่ถูกจำกัดด้วยงบหน่วยความจำของแท็บ Log และ event stream ควรเป็น NDJSON อยู่แล้ว