Сітка даних JavaScript на мільйони рядків [закрито]


225

Мені потрібно представити великій кількості рядків даних (тобто мільйони рядків) користувачеві в сітці за допомогою JavaScript.

Користувач не повинен бачити сторінки або переглядати лише обмежені кількості даних одночасно.

Швидше, мабуть, здається, що всі дані доступні.

Замість того, щоб завантажувати дані відразу, завантажуються невеликі шматки, коли користувач приходить до них (тобто, прокручуючи сітку).

Рядки не редагуватимуться через цей передній кінець, тому сітки лише для читання є прийнятними.

Які сітки даних, написані на JavaScript, існують для такого типу безперебійних підказок?


1
Я не прийняв відповідь jqgrid, оскільки, здається, не вдається для великих наборів даних ... Будь-які інші пропозиції? Що з ext-livegrid.com ?
Рудігер

6
Напишіть своє. Я впевнений, що інші захлинаються, тому що вони просто продовжують приєднуватися до DOM. Я думаю , вам потрібно рішення , яке видаляє рядки , як вони прокрутки від екрану. Це єдиний шлях. Ви просто не можете мати мільйон рядків таблиць у DOM та очікуєте, що кожен браузер може безперешкодно відображатись та прокручуватися у будь-якому середовищі. Будьте розумними.
Джош Стодола

2
@Rudiger: SlickGrid тепер підтримує необмежену кількість рядків. Дивіться сторінку github.com/mleibman/SlickGrid/tree/unlimited-rows . Після того, як це буде ретельно випробувано, воно буде об'єднане в основну гілку.
Олово

10
І мені шкода, в якій фірмі ви працюєте. Для вашої інформації на екрані 1920x1080 з відображенням лише 1 мільйон рядків буде перескакуватися 20 рядків за кожен піксель руху на смузі прокрутки. Перейдіть на тестування на зручність, а не витрачайте час.
Сон Сміт

2
Це питання та два найкращі його відповіді (принаймні) надзвичайно корисні. Це могло б залучити якісь відповіді низької якості, але це питання жодним чином не слід закривати. Використання SlickGrid для вирішення цієї проблеми може врятувати людям багато багато неприємностей і складного кодування, якщо вони спробують повторно реалізувати це для себе.
Сем Уоткінс

Відповіді:


190

( Відмова: Я автор SlickGrid )

ОНОВЛЕННЯ Це зараз реалізовано в SlickGrid .

Будь ласка, перегляньте http://github.com/mleibman/SlickGrid/isissue#issue/22 для постійної дискусії про те, як зробити SlickGrid працювати з більшою кількістю рядків.

Проблема полягає в тому, що SlickGrid не віртуалізує саму смугу прокрутки - висота області прокрутки встановлюється на загальну висоту всіх рядків. Рядки все ще додаються та видаляються під час прокрутки користувача, але сама прокрутка здійснюється браузером. Це дозволяє йому бути дуже швидким, але плавним (події в режимі прокрутки, як правило, повільно). Застереження полягає в тому, що в CSS-системах браузера є помилки / обмеження, які обмежують потенційну висоту елемента. Для IE це може бути 0x123456 або 1193046 пікселів. Для інших браузерів вона вище.

У гілці "largenum-fix" існує експериментальне вирішення, яке значно збільшує цю межу, заселяючи область, що прокручується, "сторінками", встановленими на висоту 1М пікселів, а потім використовуючи відносне позиціонування на цих сторінках. Оскільки обмеження висоти у двигуні CSS здається іншим та значно нижчим, ніж у реальному макеті двигуна, це дає нам набагато більшу верхню межу.

Я все ще шукаю спосіб досягти необмеженої кількості рядків, не відмовляючись від меж продуктивності, який SlickGrid наразі має для інших реалізацій.

Рудігере, ти можеш детальніше розповісти, як ти це вирішив?


1
Я виявив, що SlickGrid є найбільш привабливим, особливо якщо він працює з jQuery. Вітаю! (особливо за велике ставлення та наполегливість.) :-)
Андрас Васс

Я намагаюся використовувати slickgrid для показу заголовків excel, і я бачу, що при занадто великій кількості стовпців slickgrid оптимізує лише прокручування рядків, а не стовпців. Я також помітив, що, маючи більше 120 стовпців або близько того, - slickgrid ставить нові рядки в новий рядок. Чи можна встановити максимальну кількість рядків десь у файлах?
oneiros

1
SlickGrid v2.1 використовує віртуальну прокрутку як для стовпців, так і для рядків. Також було вирішено проблему, що переповнюється стовпцями.
Тинь

@Tin - Це схоже на мій підхід; Я на роки випередив свій час! "Ледачий макет блоку, примітивний для побудови нескінченної прокрутки до веб-додатків." docs.google.com/document/d/…
Рудігер

@Rudiger Так, я бачив це в групі Blink близько місяця тому, але я не зовсім впевнений, як це вписується в картину. Ледачий макет діє на елементах, фактично присутніх у DOM, чого ми не можемо реально зробити. Будь ласка, докладно:
Тин

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масиву. Решта програми використовує менший масив даних, за винятком вимірювання смуги прокрутки та кількох інших місць, які тепер не обмежені для великої кількості рядків. Загалом, було набагато простіше, ніж писати своє.
Рудігер

8
@Rudiger: SlickGrid тепер підтримує необмежену кількість рядків. Дивіться сторінку github.com/mleibman/SlickGrid/tree/unlimited-rows . Після того, як це буде ретельно випробувано, воно буде об'єднане в основну гілку.
Олово

Я намагаюся використовувати 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.
Дан Даскалеску

12
Закрутіть 5-хвилинну межу редагування коментарів. # 1 - jqGrid - 1000+ комітів ; №2 - 752 для таблиць даних ; №3 - 491 для SlickGrid ; №4 - 33 коміти для Flexigrid . Інгрід - не оновлено з червня 2011 року . jqGridView - не оновлюється з 2009 року
Дан Даскалеску

3
Спираючись на попередній коментар, я включаю кількість вил на проект тут: №1 - SlickGrid - 670 вил; №2 - jqGrid - 358 вилок; №3 - Флексигрид - 238; №4 - таблиці даних - 216; № 5 - Інгрід - 41; # 6 - jqGridView - 0;
ljs.dev

1
Погляньте на nexts.github.io/Clusterize.js
Денис

Чи можу я прокоментувати, що Slickgrid все ще живий і здоровий, але цитований вище репортаж mleibman мертвий. Нове посилання: github.com/6pac/SlickGrid (mleibman посилається на це у фінальній записці до свого репо), або на www.slickgrid.net
Бен Макінтайр

25

Я не маю на увазі розпочати полум’яну війну, але припускаючи, що ваші дослідники люди, ви їх не знаєте так добре, як ви думаєте. Тільки тому, що у них є петабайти даних, це не робить їх здатним переглядати навіть мільйони записів у будь-який змістовний спосіб. Вони можуть сказати, що хочуть побачити мільйони записів, але це просто нерозумно. Попросіть ваших розумніших дослідників зробити якусь основну математику: припустимо, що вони витрачають 1 секунду на перегляд кожного запису. З такою швидкістю знадобиться 1000000 секунд, що працює більше шести тижнів (40 годин робочих тижнів без перерв на їжу чи туалет).

Вони (або ви) серйозно думаєте, що одна людина (та, яка дивиться на сітку) може зібрати таку концентрацію? Чи справді вони багато чого роблять за цю секунду, або вони (скоріше) фільтрують речі, які не хочуть? Я підозрюю, що після перегляду підмножини "розумного розміру" вони могли б описати вам фільтр, який автоматично відфільтрував би ці записи.

Як випливали також paxdiablo і Sleeper Smith і Lasse V Karlsen, ви (і вони) не продумали вимог. З іншого боку, тепер, коли ви знайшли SlickGrid, я впевнений, що необхідність цих фільтрів стала негайно очевидною.


2
Немає потреби в мільйонах рядків не завжди полягає в їх перегляді. Іноді клієнти хочуть часткового скидання записів для роботи у власних системах аналізу даних.
cbmeeks

10
Якщо це дамп даних для їх власного аналізу, то він не відображатиметься в сітці на веб-сторінці, чи не так?
Стівен Бенітес

5
я не повинен їх бачити відразу. Саме для цього і сортують стовпці Ctrl+F. Альтернатива (підкачка, пошук веб-сайтів) набагато гірша. Просто подивіться на StackOverflow, коли намагаєтеся прокручувати питання чи відповіді, Reddit, щоб прокрутити історію коментарів користувача. Сортування та миттєвий пошук забезпечують потужність, яку має провідник Windows, але веб-сайтів бракує.
Ян Бойд

15

Я можу сказати з досить хорошою впевненістю, що вам серйозно не потрібно показувати мільйони рядків даних користувачеві.

У світі немає жодного користувача, який зможе зрозуміти або керувати цим набором даних, навіть якщо технічно вдається витягнути його, ви не вирішите жодної відомої проблеми для цього користувача.

Натомість я б зосередився на тому, чому користувач хоче бачити дані. Користувач не хоче бачити дані просто для того, щоб побачити дані, зазвичай виникає запитання. Якщо ви зосередьтесь на тому, щоб відповісти на ці запитання, то ви були б набагато ближче до чогось, що вирішує актуальну проблему.


16
Мої користувачі - це дослідники, які використовуються для петабайт даних. Я думаю, що я знаю своїх користувачів трохи краще, ніж ви, хоча ви, звичайно, праві в загальному випадку. Щодо того, чому ця мережа даних є просто частиною набору інструментів для управління великими даними.
Рудігер

7

Я рекомендую сітку Ext JS з функцією "Буферний вигляд".

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


Дійсно, справді. В основному він побудований спеціально для представлення даних
KdgDev

1
ExtJs настільки гарний, що я хочу плакати, що його не побудували на jQuery
Джеймс Вестгейт,

Тепер ви можете завантажувати лише пов'язані з сіткою частини ExtJS, так що додавання сітки ExtJS до вашої програми не буде занадто важким. Однак вам все одно доведеться враховувати відмінності у зовнішньому вигляді та використовувати спосіб розробки теми ExtJS лише для цього компонента.
JD Smith

7

(Відмова: Я є автором w2ui)

Нещодавно я написав статтю про те, як реалізувати сітку JavaScript з 1 мільйоном записів ( http://w2ui.com/web/blog/7/JavaScript-Grid-with-One-Million-Records ). Я виявив, що в кінцевому рахунку є 3 обмеження, які заважають приймати його більш високо:

  1. Висота діва має обмеження (можна подолати віртуальною прокруткою)
  2. Такі операції, як сортування та пошук, починають повільно після 1 мільйона записів або близько того
  3. Оперативна пам’ять обмежена, оскільки дані зберігаються в масиві JavaScript

Я перевірив сітку з 1 мільйоном записів (крім IE), і вона працює добре. Дивіться статтю щодо демонстрацій та прикладів.


З цим записом на мільйон ваша сторінка html має розмір 3 Мб, але коли я завантажую свої дані, сторінка становить 15 Мб, чи може w2ui це впоратися? Мені потрібні всі дані для деяких розрахунків.
Четан С. Чодхарі

6

dojox.grid.DataGrid пропонує абстрагування даних JS, щоб ви могли підключити їх до різноманітних програм у наданих магазинах dojo.data або написати свій власний. Очевидно, вам знадобиться такий, який підтримує випадковий доступ для цих багатьох записів. DataGrid також забезпечує повну доступність.

Редагуйте, ось ось посилання на статтю Меттью Рассела, яка має навести потрібний вам приклад, переглядаючи мільйони записів за допомогою dojox.grid. Зауважте, що він використовує стару версію сітки, але концепції однакові, були лише деякі несумісні поліпшення API.

О, і це абсолютно безкоштовно з відкритим кодом.



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 у ці комірки. Панель прокрутки практично не має прямого відношення до того, скільки місця (висоти) потрібно для представлення всього набору даних. Ви можете довільно встановити висоту контейнера таблиці, скажімо, 5000px, і зіставити їх із загальною кількістю рядків. Наприклад, якщо висота контейнерів становить 5000 пікселів і в цілому є 10 М рядків, то starting row ≈ (scroll.top/5000) * 10Mде scroll.topпредставлено відстань прокрутки від верхньої частини контейнера. Тут невелика демонстрація .

Щоб визначити, коли потрібно запитувати більше даних, в ідеалі об'єкт повинен виступати посередником, який слухає події прокрутки. Цей об'єкт відслідковує, наскільки швидко користувач прокручується, і коли схоже на те, що користувач сповільнюється або повністю зупинився, робить запит даних для відповідних рядків. Отримання даних таким чином означає, що ваші дані будуть фрагментовані, тому кеш повинен бути розроблений з урахуванням цього.

Також важлива роль може відігравати обмеження браузера щодо максимальних вихідних з'єднань. Користувач може прокрутити до певної позиції, яка запустить запит AJAX, але перед цим завершення користувач може прокрутити до якоїсь іншої частини. Якщо сервер не реагує достатньо, запити будуть чергуватися, і програма виглядатиме невідповідно. Ви можете використовувати диспетчер запитів, за допомогою якого проводяться всі запити, і він може скасувати очікувані запити, щоб звільнити місце.


4

Я знаю, що це старе питання, але все-таки .. Є також dhtmlxGrid, який може обробляти мільйони рядків. Існує демонстрація з 50 000 рядків, але кількість рядків, які можна завантажувати / обробляти в сітці, необмежена.

Відмова: Я з команди DHTMLX.


Я хочу показати дані Json 10 Мб і хочу використовувати їх у підрахунку, чи може DHTMLX це зробити, якщо ці теги та HTML-теги мою сторінку браузера становлять близько 15 Мб. Чи варто використовувати DHTMLX?
Четан С. Чодхарі


3

Відмова: Я активно використовую YUI DataTable без жодного головного болю протягом тривалого часу . Він потужний і стабільний. Для ваших потреб, ви можете використовувати ScrollingDataTable Wich suports

  • x-прокрутка
  • y-прокрутка
  • xy-прокрутка
  • Потужний механізм подій

Для того, що вам потрібно, я думаю, що ви хочете, це tableScrollEvent . Його API говорить

Запускається, коли фіксована прокрутка DataTable має прокрутку.

Оскільки кожен DataTable використовує DataSource, ви можете контролювати його дані через tableScrollEvent разом з розміром циклу візуалізації , щоб заповнити ваш ScrollingDataTable відповідно до ваших потреб.

Розмір циклу візуалізації говорить

У випадках, коли вашій DataTable потрібно відображати весь великий набір даних, конфігурація renderLoopSize може допомогти керувати візуалізацією DOM браузера, щоб потік інтерфейсу не замикався на дуже великих таблицях . Будь-яке значення, що перевищує 0, призведе до того, що візуалізація DOM буде виконуватися в ланцюгах setTimeout (), які надають вказану кількість рядків у кожному циклі. Ідеальне значення повинно визначатися для кожної реалізації, оскільки немає жорстких та швидких правил, а лише загальні вказівки:

  • За замовчуванням renderLoopSize дорівнює 0, тому всі рядки відображаються в одному циклі. RenderLoopSize> 0 додає накладні витрати, тому використовуйте продумано.
  • Якщо ваш набір даних достатньо великий (кількість рядків X кількість складності форматування стовпців X), що користувачі відчувають затримку у візуальному візуалізації та / або це спричиняє зависання сценарію, подумайте про встановлення renderLoopSize .
  • RenderLoopSize до 50 років, мабуть, не варто. Мабуть, кращий рендерLoopSize> 100.
  • Набір даних, мабуть, не вважається достатньо великим, якщо він не має сотень і сотень рядків.
  • Наявність renderLoopSize> 0 і <загальних рядків призводить до того, що таблиця буде відображена в одному циклі (такий же, як renderLoopSize = 0), але вона також запускає функціональність, таку як розміщення рядка після візуалізації, оброблятися з окремого потоку 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 рядків - це 10 Мб сировини HTML, я не бачу чому користувачі не хочуть бачити сторінки.

Все одно ...


2

Кращий підхід, про який я міг би придумати, - це завантаження фрагменту даних у форматі json для кожного прокрутки або деякого обмеження до закінчення прокрутки. json можна легко перетворити на об'єкти, а значить, рядки таблиць можна легко побудувати ненав’язливо


Ось так я і маю. Здійснюється запит для набору рядків, відправлених ще в JSON ... Я шукаю рендерінга на стороні JavaScript, який це підтримує!
Рудігер

Що??? Що за чорт - це "клієнтський сайт-рендерінг"? Будь-якому javascript все ще потрібно буде здійснити дзвінок в Ajax - тому вам все одно доведеться влаштуватись на якомусь транспортному форматі. Ви не можете уникнути, виконавши якусь роботу. Ніхто цього не зробить за тебе мій друг.
Андрій Дроздюк

1
Я знаю, що потрібно здійснити дзвінок AJAX; ця частина проста. Клієнт запитує щось на кшталт "start = 20 & limit = 20" і отримує рядки 20-39 з сервера (формат XML або JSON). "Візуалізація на стороні клієнта" (моя термінологія!) Робить ці запити розумно (наприклад, коли користувач прокручується вниз) і безперешкодно відображає результати у досить сітці. Всупереч сказаному, хтось інший зробив цю роботу для мене. Ось що і всі інші відповіді на це питання.
Рудігер

Що ж, здається, ніхто "інший" цього не зробив для вас :)
Андрій Дроздюк

1

Я б дуже рекомендував Open rico . Спочатку це важко реалізувати, але як тільки ти схопиш його, ти ніколи не озиратимешся.




0

Погляньте на dGrid:

https://dgrid.io/

Я погоджуюся з тим, що користувачам НІКОЛИ НЕ БУДЕ переглядати мільйони рядків даних одночасно, але dGrid може відображати їх швидко (скріншото).

Не кип'ятіть океан, щоб зробити чашку чаю.


ваша чашка чаю (посилання) не знайдена. :)
Акшай

Зараз у нього є власний сайт :)
ColemanTO
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.