ตารางข้อมูลจาวาสคริปต์สำหรับแถวนับล้าน [ปิด]


225

ฉันต้องการนำเสนอแถวข้อมูลจำนวนมาก (เช่น. ล้านแถว) ให้กับผู้ใช้ในกริดโดยใช้ JavaScript

ผู้ใช้ไม่ควรเห็นหน้าหรือดูข้อมูลในปริมาณที่ จำกัด ในแต่ละครั้ง

แต่ควรปรากฏว่ามีข้อมูลทั้งหมดอยู่

แทนที่จะดาวน์โหลดข้อมูลทั้งหมดในครั้งเดียวจะมีการดาวน์โหลดชิ้นส่วนขนาดเล็กเมื่อผู้ใช้เข้ามาถึง (เช่นการเลื่อนผ่านกริด)

แถวจะไม่ถูกแก้ไขผ่านส่วนหน้านี้ดังนั้นกริดแบบอ่านอย่างเดียวจึงเป็นที่ยอมรับ

มีกริดข้อมูลใดที่เขียนด้วย JavaScript สำหรับการเพจแบบไม่มีรอยต่อชนิดนี้


1
ฉันไม่ยอมรับคำตอบ jqgrid เนื่องจากดูเหมือนว่าจะล้มเหลวสำหรับชุดข้อมูลขนาดใหญ่ ... คำแนะนำอื่น ๆ ? สิ่งที่เกี่ยวกับext-livegrid.com ?
Rudiger

6
เขียนของคุณเอง ฉันแน่ใจว่าอีกคนกำลังสำลักเพราะพวกเขาเพียงแค่ต่อท้ายกับ DOM ฉันคิดว่าคุณจะต้องมีวิธีการแก้ปัญหาที่ลบแถวที่พวกเขาเลื่อนออกจากหน้าจอ นั่นเป็นวิธีเดียว คุณไม่สามารถมีหนึ่งล้านแถวของตารางใน DOM และคาดว่าทุกเบราว์เซอร์จะแสดงและเลื่อนอย่างราบรื่นในทุกสภาพแวดล้อม มีเหตุผล
Josh Stodola

2
@Rudiger: ตอนนี้ SlickGrid รองรับจำนวนแถวได้ไม่ จำกัด ดูgithub.com/mleibman/SlickGrid/tree/unlimited-rows เมื่อสิ่งนี้ได้รับการทดสอบอย่างละเอียดมันจะถูกรวมเข้ากับสาขาหลัก
Tin

10
และฉันรู้สึกเสียใจที่คุณทำงานเพื่อ บริษัท ที่มั่นคง สำหรับข้อมูลของคุณหน้าจอขนาด 1920x1080 ที่แสดงเพียง 1 ล้านแถวจะกระโดดได้20 แถวสำหรับทุกพิกเซลการเคลื่อนไหวบนแถบเลื่อน ลองทดสอบการใช้งานแทนการเสียเวลา
Sleeper Smith

2
คำถามนี้และคำตอบสองข้อแรก (อย่างน้อย) มีประโยชน์อย่างมาก อาจดึงดูดคำตอบคุณภาพต่ำ แต่ไม่ควรปิดคำถามนี้ การใช้ SlickGrid เพื่อแก้ปัญหานี้สามารถช่วยผู้คนได้หลายชั่วโมงในการเกิดปัญหาและการเข้ารหัสที่ยากลำบากหากพวกเขาพยายามที่จะนำสิ่งนี้กลับมาใช้ใหม่ด้วยตนเอง
Sam Watkins

คำตอบ:


190

( ข้อจำกัดความรับผิดชอบ: ฉันเป็นผู้เขียน SlickGrid )

UPDATE นี้ได้ถูกนำมาใช้ในSlickGrid

โปรดดูhttp://github.com/mleibman/SlickGrid/issues#issue/22สำหรับการสนทนาอย่างต่อเนื่องเกี่ยวกับการทำให้ SlickGrid ทำงานด้วยจำนวนแถวที่มากขึ้น

ปัญหาคือ SlickGrid ไม่ได้จำลองแถบเลื่อนเอง - ความสูงของพื้นที่เลื่อนได้ถูกตั้งค่าเป็นความสูงทั้งหมดของแถวทั้งหมด แถวยังคงมีการเพิ่มและลบออกในขณะที่ผู้ใช้กำลังเลื่อน แต่เบราว์เซอร์ตัวเองทำเสร็จแล้ว ที่ช่วยให้มันเร็วมาก แต่ก็ราบรื่น (เหตุการณ์ onscroll ช้าฉาวโฉ่) ข้อแม้คือว่ามีข้อบกพร่อง / ข้อ จำกัด ในเครื่องยนต์ CSS ของเบราว์เซอร์ที่ จำกัด ความสูงที่อาจเกิดขึ้นขององค์ประกอบ สำหรับ IE นั้นเป็น 0x123456 หรือ 1193046 พิกเซล สำหรับเบราว์เซอร์อื่นมันสูงกว่า

มีวิธีแก้ไขปัญหาทดลองในสาขา "largenum-fix" ที่เพิ่มขีด จำกัด อย่างมีนัยสำคัญโดยการเติมพื้นที่เลื่อนที่มี "หน้า" ตั้งเป็นความสูงพิกเซล 1M แล้วใช้การวางตำแหน่งสัมพัทธ์ภายในหน้าเหล่านั้น เนื่องจากขีดจำกัดความสูงในเอนจิน CSS ดูเหมือนจะแตกต่างกันและต่ำกว่าในเอ็นจิ้นเลย์เอาต์จริงอย่างมากจึงทำให้เรามีขีด จำกัด สูงกว่ามาก

ฉันยังคงมองหาวิธีที่จะได้จำนวนไม่ จำกัด จำนวนแถวโดยไม่ต้องลดทอนประสิทธิภาพที่ SlickGrid ถืออยู่ในขณะนี้สำหรับการใช้งานอื่น ๆ

Rudiger คุณสามารถอธิบายอย่างละเอียดเกี่ยวกับวิธีการแก้ไขปัญหานี้ได้หรือไม่?


1
ฉันพบว่า SlickGrid น่าดึงดูดที่สุด - โดยเฉพาะถ้าใช้งานได้กับ jQuery ยินดีด้วย! (โดยเฉพาะสำหรับทัศนคติที่ดีและความเพียร) :-)
Andras Vass

ฉันพยายามใช้ slickgrid เพื่อแสดงส่วนหัว excel และฉันเห็นว่าเมื่อมีคอลัมน์ slickgrid มากเกินไปเพียงปรับการเลื่อนของแถวให้เหมาะสมเท่านั้นไม่ใช่ของคอลัมน์ ฉันยังสังเกตเห็นว่าเมื่อมีมากกว่า 120 คอลัมน์หรือมากกว่านั้น - slickgrid ทำให้แถวใหม่ในบรรทัดใหม่ สามารถตั้งค่าจำนวนแถวสูงสุดได้ที่ใดที่หนึ่งในไฟล์หรือไม่
oneiros

1
SlickGrid v2.1 ใช้การเลื่อนเสมือนจริงสำหรับคอลัมน์และแถว นอกจากนี้ปัญหาคอลัมน์ล้นได้รับการแก้ไข
ดีบุก

@Tin - คล้ายกับแนวทางของฉัน ฉันเป็นเวลาหลายปีก่อนเวลาของฉัน! "รูปแบบบล็อกขี้เกียจแบบดั้งเดิมสำหรับการสร้างการเลื่อนแบบไม่ จำกัด ลงในเว็บแอปพลิเคชัน" docs.google.co.th/document/d/…
Rudiger

@Rudiger ใช่ฉันเคยเห็นสิ่งนี้ในกลุ่ม Blink ประมาณหนึ่งเดือนที่แล้ว แต่ฉันไม่แน่ใจว่ามันเข้ากับรูปได้ดีแค่ไหน เลย์เอาต์ขี้เกียจทำงานกับองค์ประกอบที่มีอยู่จริงใน DOM ซึ่งเราทำไม่ได้จริงๆ โปรดอธิบายอย่างละเอียด :)
Tin

84

https://github.com/mleibman/SlickGrid/wiki

" SlickGrid ใช้การเรนเดอร์เสมือนเพื่อให้คุณสามารถทำงานกับหลายแสนรายการโดยไม่มีการลดประสิทธิภาพใด ๆ ในความเป็นจริงไม่มีความแตกต่างของประสิทธิภาพระหว่างการทำงานกับกริดที่มี 10 แถวกับ 100'000 แถว "

ไฮไลท์บางส่วน:

  • การเลื่อนเสมือนแบบปรับได้ (จัดการหลายแสนแถว)
  • ความเร็วการเรนเดอร์ที่เร็วมาก
  • พื้นหลังหลังการเรนเดอร์สำหรับเซลล์ยิ่งขึ้น
  • กำหนดค่าและปรับแต่งได้
  • การนำทางคีย์บอร์ดแบบเต็ม
  • ปรับขนาดคอลัมน์ / จัดลำดับใหม่ / แสดง / ซ่อน
  • การปรับขนาดคอลัมน์ & บังคับแบบอัตโนมัติ
  • ตัวฟอร์แมตและตัวแก้ไขเซลล์ที่เสียบได้
  • รองรับการแก้ไขและสร้างแถวใหม่ "โดยmleibman

ได้ฟรี (ใบอนุญาต MIT) มันใช้ jQuery


ทำงานได้ดีจนกระทั่งมีความถูกต้อง 131,001 แถว ... นั่นคือมีรหัสเช่นนี้: data.length = Math.min(131000, parseInt(resp.total));... และแน่นอนว่ารหัสนั้นยากด้วยเหตุผล :(
Rudiger

6
ใช้งานเล็กน้อย แต่ฉันทำการเปลี่ยนแปลงเล็กน้อยเพื่อให้กริดเป็นอิสระจากความยาวของdataอาร์เรย์ มันเป็นกระบอง แต่ฉันมีคำตอบที่เติมbigdataแถวและdataดึงขนาดเล็กลงจากbigdataอาร์เรย์ ส่วนที่เหลือของโปรแกรมใช้อาร์เรย์ข้อมูลที่เล็กกว่ายกเว้นการวัดแถบเลื่อนและสถานที่อื่น ๆ สองสามแห่งที่ไม่ได้ถูก จำกัด สำหรับแถวจำนวนมาก สรุปแล้วมันง่ายกว่าการเขียนของฉันเอง
Rudiger

8
@Rudiger: ตอนนี้ SlickGrid รองรับจำนวนแถวได้ไม่ จำกัด ดูgithub.com/mleibman/SlickGrid/tree/unlimited-rows เมื่อสิ่งนี้ได้รับการทดสอบอย่างละเอียดมันจะถูกรวมเข้ากับสาขาหลัก
Tin

ฉันพยายามใช้ slickgrid เพื่อแสดงส่วนหัว excel และฉันเห็นว่าเมื่อมีคอลัมน์ slickgrid มากเกินไปเพียงปรับการเลื่อนของแถวให้เหมาะสมเท่านั้นไม่ใช่ของคอลัมน์ ฉันยังสังเกตเห็นว่าเมื่อมีมากกว่า 120 คอลัมน์หรือมากกว่านั้น - slickgrid ทำให้แถวใหม่ในบรรทัดใหม่ สามารถตั้งค่าจำนวนแถวสูงสุดได้ที่ใดที่หนึ่งในไฟล์หรือไม่
oneiros

ถ้าคุณต้องการบางสิ่งที่เร็วจริงๆอย่าพึ่งพาอะไรที่ใช้ jQuery ทำสิ่งต่าง ๆ ในแกนกลางและใช้ innerHTML แทน DOM ต่อท้าย แถบเลื่อน Javascript สามารถสังเกตเห็นได้ช้ากว่าแถบเลื่อนของเบราว์เซอร์บนคอมพิวเตอร์ที่ช้าหลีกเลี่ยงกฎ CSS ที่ซับซ้อนและคุณควรใช้เวลาในการทำให้เค้าโครงของแถวเดี่ยวง่ายขึ้น การเพิ่มประสิทธิภาพของไมโครอาจมีนัยสำคัญในกรณีนี้ นี่เป็นเพียงข้อปฏิบัติทั่วไปเพื่อปรับปรุงประสิทธิภาพ jsPerf.com เป็นเพื่อนของคุณ
Vitim.us

37

กริดที่ดีที่สุดในความคิดของฉันอยู่ด้านล่าง:

3 ตัวเลือกที่ดีที่สุดของฉันคือ jqGrid, jqxGrid และ DataTables พวกเขาสามารถทำงานกับหลายพันแถวและรองรับการจำลองเสมือน


1
+1 สำหรับรายการแม้ว่าจะมีการเปรียบเทียบไม่มากนัก การเริ่มต้นที่ดีคือการเพิ่มจำนวนการคอมมิทสำหรับแต่ละ - 33 สำหรับ Flexigrid ณ ขณะนี้และ 491 สำหรับ SlickGrid
Dan Dascalescu

12
ขีด จำกัด การแก้ไขความคิดเห็น 5 นาทีของ Screw SO # 1 - jqGrid - 1000 + กระทำ ; ที่ 2 - 752 สำหรับ DataTables ; # 3 - 491 สำหรับ SlickGrid ; ที่ 4 - 33 กระทำสำหรับ Flexigrid Ingrid - ไม่มีการปรับปรุงตั้งแต่มิถุนายน 2011 jqGridView - ไม่มีการปรับปรุงตั้งแต่ 2552
Dan Dascalescu

3
การสร้างความคิดเห็นก่อนหน้านี้ฉันรวมจำนวนส้อมต่อโครงการที่นี่: # 1 - SlickGrid - 670 ส้อม; # 2 - jqGrid - 358 ส้อม # 3 - Flexigrid - 238; # 4 - DataTables - 216; # 5 - อิงกริด - 41; # 6 - jqGridView - 0;
ljs.dev

1
ลองดูที่nexts.github.io/Clusterize.js
เดนิส

ฉันสามารถแสดงความคิดเห็นว่า Slickgrid ยังมีชีวิตอยู่และดี แต่ mleibman repo อ้างถึงข้างต้นตาย ลิงค์ใหม่: github.com/6pac/SlickGrid (mleibman อ้างอิงในบันทึกสุดท้ายของ repo ของเขา) หรือ www.slickgrid.net
Ben McIntyre

25

ฉันไม่ได้ตั้งใจจะเริ่มสงครามไฟ แต่สมมุติว่านักวิจัยของคุณเป็นมนุษย์คุณไม่รู้จักพวกเขาเช่นเดียวกับที่คุณคิด เพียงเพราะพวกเขามีเพตาไบต์ของข้อมูลไม่ได้ทำให้พวกเขาสามารถดูได้นับล้านระเบียนในลักษณะที่มีความหมายใด ๆ พวกเขาอาจบอกว่าพวกเขาต้องการดูบันทึกเป็นล้าน ๆ แผ่น แต่มันก็โง่ ให้นักวิจัยที่ฉลาดที่สุดทำคณิตศาสตร์พื้นฐาน: สมมติว่าพวกเขาใช้เวลา 1 วินาทีในการดูแต่ละระเบียน ในอัตราดังกล่าวจะใช้เวลา 1000000 วินาทีซึ่งทำงานได้นานกว่าหกสัปดาห์ (จาก 40 ชั่วโมงทำงานต่อสัปดาห์โดยไม่หยุดพักเพื่อทานอาหารหรือเข้าห้องน้ำ)

พวกเขา (หรือคุณ) คิดอย่างจริงจังว่าคนคนหนึ่ง (คนที่กำลังมองหาที่กริด) สามารถรวบรวมสมาธิแบบนั้นได้หรือไม่? พวกเขาทำได้ดีมากใน 1 วินาทีนั้นหรือพวกเขา (มีแนวโน้มมากกว่า) กรองสิ่งที่ไม่ต้องการหรือไม่ ฉันสงสัยว่าหลังจากดูชุดย่อย "ขนาดที่เหมาะสม" พวกเขาสามารถอธิบายตัวกรองให้คุณทราบซึ่งจะกรองข้อมูลเหล่านั้นออกโดยอัตโนมัติ

ในขณะที่ paxdiablo และ Sleeper Smith และ Lasse V Karlsen ก็บอกเป็นนัยว่าคุณ (และพวกเขา) ก็ไม่ได้คิดตามข้อกำหนด ในอีกด้านหนึ่งตอนนี้คุณได้พบ SlickGrid แล้วฉันมั่นใจว่าความต้องการตัวกรองเหล่านั้นจะชัดเจนขึ้นทันที


2
การมีความต้องการแถวนับล้านนั้นไม่ได้เกี่ยวกับการดู บางครั้งลูกค้าต้องการถ่ายโอนข้อมูลบางส่วนเพื่อใช้ในระบบวิเคราะห์ข้อมูลของตัวเอง
cbmeeks

10
หากการถ่ายโอนข้อมูลสำหรับการวิเคราะห์ของตัวเองมันจะไม่ปรากฏในตารางบนหน้าเว็บใช่ไหม
Steven Benitez

5
ฉันไม่ต้องเห็นพวกเขาทั้งหมดในครั้งเดียว นั่นคือสิ่งที่จัดเรียงคอลัมน์และCtrl+Fมีไว้สำหรับ ทางเลือก (เพจการค้นหาเว็บไซต์) เป็นมากที่เลวร้ายยิ่ง เพียงแค่ดูที่ StackOverflow เมื่อพยายามเลื่อนดูคำถามหรือคำตอบ Reddit สำหรับการเลื่อนดูประวัติความคิดเห็นของผู้ใช้ การเรียงลำดับและการค้นหาแบบทันทีให้พลังงานที่ Windows Explorer มี แต่เว็บไซต์ขาด
Ian Boyd

15

ฉันสามารถพูดได้ด้วยความมั่นใจที่ดีงามว่าคุณไม่จำเป็นต้องแสดงข้อมูลเป็นล้านแถวแก่ผู้ใช้

ไม่มีผู้ใช้ในโลกที่จะสามารถเข้าใจหรือจัดการชุดข้อมูลนั้นได้แม้ว่าคุณจะสามารถดึงมันออกมาได้ในทางเทคนิคแล้วคุณก็จะไม่แก้ปัญหาใด ๆ ที่ผู้ใช้รู้

แต่ฉันจะมุ่งเน้นไปที่สาเหตุที่ผู้ใช้ต้องการดูข้อมูล ผู้ใช้ไม่ต้องการเห็นข้อมูลเพียงเพื่อดูข้อมูลมักจะมีคำถามที่ถูกถาม หากคุณมุ่งเน้นที่จะตอบคำถามเหล่านั้นแทนคุณจะเข้าใกล้สิ่งที่ช่วยแก้ปัญหาที่เกิดขึ้นจริง


16
ผู้ใช้ของฉันคือนักวิจัยที่คุ้นเคยกับเพตาไบต์ของข้อมูล ฉันคิดว่าฉันรู้ว่าผู้ใช้ของฉันดีกว่าที่คุณทำเล็กน้อยถึงแม้ว่าคุณจะถูกต้องในกรณีทั่วไป สำหรับสาเหตุที่ DataGrid นี้เป็นเพียงส่วนหนึ่งของชุดเครื่องมือสำหรับการจัดการข้อมูลขนาดใหญ่
Rudiger

7

ฉันขอแนะนำ Ext JS Grid พร้อมกับคุณสมบัติมุมมองบัฟเฟอร์

http://www.extjs.com/deploy/dev/examples/grid/buffer.html


ExtJs แน่นอน มันถูกสร้างขึ้นโดยเฉพาะอย่างยิ่งสำหรับการนำเสนอข้อมูล
KdgDev

1
ExtJs ดีมากฉันอยากจะร้องไห้ว่ามันไม่ได้สร้างขึ้นบน jQuery
James Westgate

ตอนนี้คุณสามารถโหลดเฉพาะส่วนที่เกี่ยวข้องกับกริดของ ExtJS เท่านั้นดังนั้นการเพิ่มกริด ExtJS ในแอปพลิเคชันของคุณจะไม่หนักเกินไป อย่างไรก็ตามคุณยังต้องพิจารณาถึงความแตกต่างของรูปลักษณ์และใช้วิธีการของ ExtJS สำหรับองค์ประกอบนั้น
JD Smith

7

(ข้อจำกัดความรับผิดชอบ: ฉันเป็นผู้เขียน w2ui)

เมื่อเร็ว ๆ นี้ฉันได้เขียนบทความเกี่ยวกับวิธีการใช้กริด JavaScript ที่มี 1 ล้านบันทึก ( http://w2ui.com/web/blog/7/JavaScript-Grid-with-One-Million-Records ) ฉันค้นพบว่าในที่สุดมีข้อ จำกัด 3 ประการที่ป้องกันไม่ให้สูงขึ้น:

  1. ความสูงของ div มีขีด จำกัด (สามารถเอาชนะได้โดยการเลื่อนเสมือน)
  2. การดำเนินการเช่นการเรียงลำดับและการค้นหาเริ่มช้าลงหลังจากมีการบันทึก 1 ล้านครั้ง
  3. RAM ถูก จำกัด เนื่องจากข้อมูลถูกเก็บไว้ในอาร์เรย์ JavaScript

ฉันได้ทดสอบกริดกับ 1 ล้านบันทึก (ยกเว้น IE) และทำงานได้ดี ดูบทความสำหรับการสาธิตและตัวอย่าง


ด้วยหนึ่งล้านบันทึกหน้า html ของคุณมีขนาด 3MB แต่เมื่อฉันโหลดข้อมูลหน้าของฉันมีขนาด 15MB w2ui สามารถจัดการกับมันได้หรือไม่ ฉันต้องการข้อมูลทั้งหมดสำหรับการคำนวณบางอย่าง
Chetan S. Choudhary

6

dojox.grid.DataGridเสนอนามธรรม JS สำหรับข้อมูลเพื่อให้คุณสามารถเชื่อมโยงกับแบ็กเอนด์ต่าง ๆ กับร้านค้า dojo.data ที่ให้มาหรือเขียนของคุณเอง คุณจะต้องมีหนึ่งที่รองรับการเข้าถึงแบบสุ่มสำหรับบันทึกจำนวนมากนี้ DataGrid ยังให้การเข้าถึงอย่างเต็มรูปแบบ

แก้ไขดังนั้นนี่คือลิงก์ไปยังบทความของ Matthew Russellที่ควรให้ตัวอย่างที่คุณต้องการโดยดู dojox.grid หลายล้านรายการ โปรดทราบว่ามันใช้กริดเวอร์ชันเก่า แต่แนวคิดเหมือนกันมีเพียงการปรับปรุง API ที่เข้ากันไม่ได้บางอย่างเท่านั้น

โอ้และมันก็โอเพนซอร์สฟรี


4

2
Dojo ยังเสนอกริดที่ดี: docs.dojocampus.org/dojox/grid/DataGrid
0r

เศร้าที่เห็น jqgrid ไม่ทำงานที่นี่ ... พวกเขาเชื่อมโยงไปยังstackoverflow.com/questions/tagged/jqgridจากเว็บไซต์ของพวกเขาtrirand.net
Rudiger

4

ต่อไปนี้คือการเพิ่มประสิทธิภาพสองสามประการที่คุณสามารถนำมาใช้เพื่อเร่งความเร็ว แค่คิดออกมาดัง ๆ

เนื่องจากจำนวนแถวสามารถเป็นล้านคุณจะต้องการระบบแคชสำหรับข้อมูล JSON จากเซิร์ฟเวอร์ ฉันนึกภาพไม่ออกว่าใครที่ต้องการดาวน์โหลด X ล้านรายการทั้งหมด แต่ถ้าพวกเขาทำมันจะเป็นปัญหา นี้การทดสอบเล็ก ๆ น้อย ๆเกี่ยวกับ Chrome สำหรับอาร์เรย์ใน 20M + จำนวนเต็มเกิดปัญหาในเครื่องของฉันอย่างต่อเนื่อง

var data = [];
for(var i = 0; i < 20000000; i++) {
    data.push(i);
}
console.log(data.length);​

คุณสามารถใช้LRUหรืออัลกอริธึมการแคชอื่นและมีขอบเขตบนว่าคุณต้องการแคชข้อมูลมากแค่ไหน

สำหรับเซลล์ตารางเองฉันคิดว่าการสร้าง / ทำลายโหนด DOM อาจมีราคาแพง แต่คุณสามารถกำหนดจำนวนเซลล์ X ล่วงหน้าได้และเมื่อใดก็ตามที่ผู้ใช้เลื่อนไปที่ตำแหน่งใหม่ฉีดข้อมูล JSON ลงในเซลล์เหล่านี้ แถบเลื่อนแทบจะไม่มีความสัมพันธ์โดยตรงกับจำนวนพื้นที่ (ความสูง) ที่ต้องการเพื่อแสดงชุดข้อมูลทั้งหมด คุณสามารถตั้งค่าความสูงของคอนเทนเนอร์ตารางโดยพลการพูด 5,000px และแม็พกับจำนวนแถวทั้งหมด ตัวอย่างเช่นหากความสูงของคอนเทนเนอร์เป็น 5,000px และมีทั้งหมด 10M แถวดังนั้นstarting row ≈ (scroll.top/5000) * 10Mที่จะscroll.topแสดงระยะทางเลื่อนจากด้านบนของภาชนะ ขนาดเล็กสาธิตที่นี่

ในการตรวจจับเมื่อต้องการขอข้อมูลเพิ่มเติมวัตถุควรทำหน้าที่เป็นสื่อกลางที่ฟังการเลื่อนเหตุการณ์ วัตถุนี้ติดตามว่าผู้ใช้เลื่อนเร็วแค่ไหนและเมื่อดูเหมือนว่าผู้ใช้กำลังชะลอตัวลงหรือหยุดทำงานอย่างสมบูรณ์ทำให้คำขอข้อมูลสำหรับแถวที่เกี่ยวข้อง การดึงข้อมูลในลักษณะนี้หมายความว่าข้อมูลของคุณจะถูกแยกส่วนดังนั้นแคชควรได้รับการออกแบบโดยคำนึงถึงสิ่งนั้น

เบราว์เซอร์ยัง จำกัด การเชื่อมต่อขาออกสูงสุดสามารถเล่นเป็นส่วนสำคัญ ผู้ใช้อาจเลื่อนไปยังตำแหน่งที่แน่นอนซึ่งจะเริ่มการร้องขอ AJAX แต่ก่อนที่ผู้ใช้จะสามารถเลื่อนไปยังส่วนอื่น ๆ ได้ หากเซิร์ฟเวอร์ไม่ตอบสนองเพียงพอคำขอจะเข้าคิวและแอปพลิเคชันจะไม่ตอบสนอง คุณสามารถใช้ตัวจัดการการร้องขอผ่านการร้องขอทั้งหมดที่ถูกกำหนดเส้นทางและสามารถยกเลิกการร้องขอที่ค้างอยู่เพื่อให้มีที่ว่าง


4

ฉันรู้ว่ามันเป็นคำถามเก่า แต่ก็ยังมี .. นอกจากนี้ยังมีdhtmlxGridที่สามารถจัดการกับแถวนับล้าน มีการสาธิตพร้อม 50,000 แถวแต่จำนวนแถวที่สามารถโหลด / ประมวลผลในกริดนั้นไม่ จำกัด

คำเตือน: ฉันมาจากทีม DHTMLX


ฉันต้องการแสดงข้อมูล Json 10 MB และต้องการใช้ในการคำนวณ DHTMLX สามารถทำสิ่งนั้นได้ด้วยข้อมูลและแท็ก html ที่หน้าเบราว์เซอร์ของฉันมีขนาดประมาณ 15 MB ควรใช้ DHTMLX หรือไม่
Chetan S. Choudhary


3

Disclaimer: ฉันหนักใช้YUI DataTable โดยไม่ต้องปวดหัวไม่เป็นเวลานาน มันทรงพลังและมั่นคง สำหรับความต้องการของคุณสามารถใช้ScrollingDataTable suports ช

  • x เลื่อน
  • Y-เลื่อน
  • XY-เลื่อน
  • กลไกเหตุการณ์ที่ทรงพลัง

สำหรับสิ่งที่คุณต้องการผมคิดว่าคุณต้องการคือtableScrollEvent API ของมันบอกว่า

ยิงเมื่อ DataTable การเลื่อนแบบตายตัวมีการเลื่อน

เนื่องจากแต่ละ DataTable ใช้แหล่งข้อมูลคุณสามารถตรวจสอบข้อมูลผ่าน tableScrollEvent พร้อมกับขนาดลูปการเรนเดอร์เพื่อเติมข้อมูล ScrollingDataTable ตามความต้องการของคุณ

ขนาดลูปการแสดงผลพูดว่า

ในกรณีที่มีความต้องการ DataTable ของคุณเพื่อแสดงความสมบูรณ์ของชุดที่มีขนาดใหญ่มากของข้อมูลการตั้งค่า renderLoopSize สามารถช่วยในการจัดการการแสดงผลเบราว์เซอร์ DOM เพื่อให้หัวข้อ UI ไม่ได้รับการล็อคขึ้นบนโต๊ะขนาดใหญ่มาก ค่าใด ๆ ที่มากกว่า 0 จะทำให้การเรนเดอร์ DOM ถูกเรียกใช้ในเชน setTimeout () ที่แสดงจำนวนแถวที่ระบุในแต่ละลูป ควรกำหนดมูลค่าที่เหมาะสมต่อการใช้งานเนื่องจากไม่มีกฎที่ยากและรวดเร็วเพียงแนวทางทั่วไปเท่านั้น:

  • โดยดีฟอลต์ renderLoopSize คือ 0 ดังนั้นแถวทั้งหมดจะถูกเรนเดอร์ในลูปเดียว renderLoopSize> 0 เพิ่มโอเวอร์เฮดดังนั้นให้ใช้อย่างรอบคอบ
  • หากชุดข้อมูลของคุณก็พอขนาดใหญ่ (จำนวนแถว X จำนวนคอลัมน์ X รูปแบบซับซ้อน) ที่ผู้ใช้มีประสบการณ์ความล่าช้าในการแสดงผลภาพและ / หรือจะทำให้สคริปต์เพื่อแขวนพิจารณาตั้ง renderLoopSize
  • renderLoopSize ที่ต่ำกว่า 50 อาจไม่คุ้มค่า renderLoopSize> 100 น่าจะดีกว่า
  • ชุดข้อมูลอาจไม่ถือว่าใหญ่พอเว้นแต่จะมีหลายร้อยและหลายร้อยแถว
  • การมี renderLoopSize> 0 และ <ผลรวมแถวทำให้ตารางถูกเรนเดอร์ในหนึ่งลูป (เหมือนกับ renderLoopSize = 0) แต่มันยังทริกเกอร์การทำงานเช่นการสตริปแถว post-render ที่จะจัดการจากเธรด setTimeout แยกต่างหาก

ตัวอย่างเช่น

// Render 100 rows per loop
 var dt = new YAHOO.widget.DataTable(<WHICH_DIV_WILL_STORE_YOUR_DATATABLE>, <HOW YOUR_TABLE_IS STRUCTURED>, <WHERE_DOES_THE_DATA_COME_FROM>, {
     renderLoopSize:100
 });

<WHERE_DOES_THE_DATA_COME_FROM> เป็นเพียงหนึ่งเดียวแหล่งข้อมูล มันสามารถเป็น JSON, JSFunction, XML และแม้กระทั่งองค์ประกอบ HTML เดียว

ที่นี่คุณสามารถดูบทแนะนำแบบง่ายที่จัดทำโดยฉัน ระวังไม่มีปลั๊กอิน DATA_TABLE อื่นรองรับการคลิกเดี่ยวและคู่ในเวลาเดียวกัน YUI DataTable ช่วยให้คุณ และยิ่งกว่านั้นคุณสามารถใช้กับ JQuery ได้โดยไม่ต้องปวดหัว

ตัวอย่างบางส่วนคุณสามารถดู

อย่าลังเลที่จะถามเกี่ยวกับสิ่งอื่นที่คุณต้องการเกี่ยวกับ YUI DataTable

ความนับถือ,


3

ฉันไม่เห็นจุดสำหรับ jqGrid คุณสามารถใช้ฟังก์ชันการเลื่อนเสมือน:

http://www.trirand.net/aspnetmvc/grid/performancevirtualscrolling

แต่หลังจากนั้นอีกนับล้านแถวที่มีการกรองสามารถทำได้:

http://www.trirand.net/aspnetmvc/grid/performancelinq

ฉันไม่เห็นจุด "ราวกับว่าไม่มีหน้าเว็บ" แต่ฉันหมายความว่า ... ไม่มีวิธีที่จะแสดง 1,000,000 แถวในเบราว์เซอร์พร้อมกัน - นี่คือ HTML ดิบ 10MB ฉันไม่เห็นอะไรเลย สาเหตุที่ผู้ใช้ไม่ต้องการเห็นหน้า

อย่างไรก็ตาม...


2

วิธีที่ดีที่สุดที่ฉันคิดได้ก็คือโหลดข้อมูลในรูปแบบ json สำหรับทุกการเลื่อนหรือการ จำกัด ก่อนที่การเลื่อนจะสิ้นสุด json สามารถแปลงเป็นวัตถุได้อย่างง่ายดายและด้วยเหตุนี้แถวของตารางจึงสามารถสร้างได้อย่างง่ายดายโดยไม่เป็นการรบกวน


นั่นเป็นวิธีที่ฉันมี มีการร้องขอสำหรับชุดของแถวที่ส่งกลับไปใน JSON ... ฉันกำลังมองหาตัวแสดงฝั่งไคลเอ็นต์ javascript ที่สนับสนุนสิ่งนี้!
Rudiger

อะไร??? สิ่งที่ heck คือ "ลูกค้าเว็บไซต์ renderer"? จาวาสคริปต์ใด ๆ จะต้องทำการโทร ajax - ดังนั้นคุณจะต้องชำระในรูปแบบการขนส่งบางอย่าง คุณไม่สามารถหลบหนีจากการทำงาน เพื่อนของฉันจะไม่ทำอย่างนี้กับคุณ
Andriy Drozdyuk

1
ฉันรู้ว่าต้องทำการโทร AJAX ส่วนนี้ง่าย ลูกค้าร้องขอบางอย่างเช่น "start = 20 & limit = 20" และดึงแถว 20-39 จากเซิร์ฟเวอร์ (รูปแบบ XML หรือ JSON) "renderer ฝั่งไคลเอ็นต์" (คำศัพท์ของฉัน!) ทำให้การร้องขอเหล่านี้อย่างชาญฉลาด (เช่นเมื่อผู้ใช้เลื่อนลง) และแสดงผลอย่างราบรื่นในตารางสวย ตรงกันข้ามกับสิ่งที่คุณพูดคนอื่นทำงานนี้ให้ฉัน นั่นคือทั้งหมดที่คำตอบอื่น ๆ สำหรับคำถามนี้คือ
Rudiger

ดูเหมือนว่าไม่มีใคร "คนอื่น" ได้ทำเพื่อคุณ :)
Andriy Drozdyuk

1

ฉันอยากจะแนะนำเปิดเปอร์โตริโก เป็นการยากที่จะนำไปใช้ในการเริ่มต้น แต่เมื่อคุณคว้ามันคุณจะไม่หันกลับมามอง




0

ดูที่ dGrid:

https://dgrid.io/

ฉันยอมรับว่าผู้ใช้จะไม่เคยต้องดูข้อมูลหลายล้านแถวในคราวเดียว แต่ dGrid สามารถแสดงข้อมูลได้อย่างรวดเร็ว (เป็นหน้าจอพร้อมกัน)

อย่าต้มมหาสมุทรเพื่อชงชาสักถ้วย


ไม่พบถ้วยชาของคุณ (ลิงก์) :)
Akshay

มันมีเว็บไซต์เป็นของตัวเองแล้วตอนนี้ :)
24419
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.