Сетка данных JavaScript для миллионов строк

214

Мне нужно представить большое количество строк данных (т.е. миллионов строк) пользователю в сетке с использованием JavaScript.

Пользователь не должен видеть страницы или просматривать только конечные объемы данных за раз.

Скорее, должно показаться, что все данные доступны.

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

Строки не будут редактироваться с помощью этого интерфейса, поэтому допустимы сетки только для чтения.

Какие сетки данных, написанные на JavaScript, существуют для этого типа бесшовного пейджинга?

  • 1
    Я не принял ответ jqgrid, так как он, похоже, не подходит для больших наборов данных ... Есть другие предложения? Как насчет ext-livegrid.com ?
  • 0
    Я реализовал ext-livegrid, и это также не подходит для больших наборов данных (т.е. более 50 000 строк). Любые надежные реализации этого, или я должен пойти с Adobe Flex (который я знаю, может это сделать)?
Показать ещё 18 комментариев
Теги:
datagrid
slickgrid

19 ответов

180
Лучший ответ

(Отказ от ответственности: я автор SlickGrid)

UPDATE Это теперь реализовано в SlickGrid.

См. http://github.com/mleibman/SlickGrid/issues#issue/22 для продолжения обсуждения работы SlickGrid с большим количеством строк.

Проблема в том, что SlickGrid не виртуализирует саму полосу прокрутки - высота прокручиваемой области устанавливается на общую высоту всех строк. Строки все еще добавляются и удаляются по мере прокрутки пользователя, но сама прокрутка выполняется браузером. Это позволяет ему быть очень быстрым, но сглаженным (события onscroll, как известно, медленны). Предостережение заключается в том, что в браузерах есть ошибки/ограничения, которые ограничивают потенциальную высоту элемента. Для IE это 0x123456 или 1193046 пикселей. Для других браузеров он выше.

Существует экспериментальное обходное решение в ветке "largenum-fix", которое значительно увеличивает этот предел за счет заполнения прокручиваемой области "страницами", установленной на высоту 1 М пикселей, а затем используя относительное позиционирование в этих страницах. Поскольку предел высоты в движке CSS кажется другим и значительно ниже, чем в реальном макете, это дает нам гораздо более высокий верхний предел.

Я все еще ищу способ получить неограниченное количество строк, не отказываясь от края производительности, которое SlickGrid в настоящее время поддерживает над другими реализациями.

Рудигер, не могли бы вы рассказать о том, как вы это решили?

  • 9
    большое спасибо, я пробую довольно много сеток, и никто не приблизится к производительности SlickGrid
  • 3
    Вы рок, мистер Лейбман! Извините, что не уточнил, как я решил это; NDA и мое смущающее хакерское решение помешали мне ответить. Тем не менее, я сменил свой хак на неограниченные ряды, и я впечатлен. SlickGrid теперь является верным ответом на этот вопрос ... Я должен тебе пива!
Показать ещё 7 комментариев
84

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

"SlickGrid использует виртуальный рендеринг, чтобы вы могли легко работать с сотнями тысяч элементов без какого-либо снижения производительности. На самом деле нет разницы в производительности между работой с сеткой с 10 строками по сравнению с 100000 строками".

Некоторые основные моменты:

  • Адаптивная виртуальная прокрутка (обрабатывает сотни тысяч строк)
  • Чрезвычайно быстрая скорость рендеринга
  • Фоновый пост-рендеринг для более насыщенных ячеек
  • Конфигурируемые и настраиваемые
  • Полная навигация по клавиатуре
  • Изменение/изменение порядка столбцов/отображение/скрытие
  • Автоматическая сортировка колонки и принудительная установка
  • Вставные форматы и редакторы ячеек
  • Поддержка редактирования и создания новых строк. " mleibman

Это бесплатно (лицензия MIT). Он использует jQuery.

  • 0
    Я проверяю это, поэтому надеюсь, что он работает с 10.000.000 строк ...
  • 41
    «Нет разницы в производительности между работой с сеткой из 10 строк и 100 000 строк» может означать, что она справляется и с 10 строками :-)
Показать ещё 7 комментариев
29

Лучшие сетки, на мой взгляд, ниже:

Мои лучшие 3 варианта: jqGrid, jqxGrid и DataTables. Они могут работать с тысячами строк и поддерживать виртуализацию.

  • 1
    +1 за список, хотя для сравнения не так много. Хорошим началом будет добавление количества коммитов для каждого - 33 для Flexigrid на данный момент, против 491 для SlickGrid.
  • 11
    Винт SO 5-минутный лимит редактирования комментариев. # 1 - jqGrid - 1000+ коммитов ; № 2 - 752 для таблиц данных ; № 3 - 491 для SlickGrid ; № 4 - 33 коммитов для Flexigrid . Ингрид - без обновления с июня 2011 года . jqGridView - без обновления с 2009 года
Показать ещё 3 комментария
23

Я не хочу начинать пламенную войну, но предполагая, что ваши исследователи являются людьми, вы не знаете их так хорошо, как вы думаете. Просто потому, что у них есть петабайты данных, они не позволяют им просматривать даже миллионы записей каким-либо значимым образом. Они могут сказать, что хотят видеть миллионы записей, но это просто глупо. Попросите ваших умных исследователей сделать базовую математику: предположите, что они тратят 1 секунду на просмотр каждой записи. При таком расчете потребуется 1000000 секунд, что составляет более шести недель (40-часовые рабочие недели без перерывов для еды или туалета).

Они (или вы) серьезно думают, что один человек (тот, кто смотрит на сетку) может собрать такую ​​концентрацию? Неужели они действительно много делают за 1 секунду, или они (более вероятно) отфильтровывают вещи, которые не хотят? Я подозреваю, что после просмотра подмножества "разумного размера" они могли бы описать фильтр для вас, который автоматически отфильтровывал эти записи.

Как и подразумевались paxdiablo и Sleeper Smith и Lasse V Karlsen, вы (и они) не продумали требования. С другой стороны, теперь, когда вы нашли SlickGrid, я уверен, что необходимость в этих фильтрах стала очевидной.

  • 1
    Потребность в миллионах строк не всегда связана с их просмотром. Иногда клиенты хотят частичный дамп записей для запуска в своих собственных системах анализа данных.
  • 9
    Если это дамп данных для их собственного анализа, то он не будет отображаться в сетке на веб-странице, не так ли?
Показать ещё 1 комментарий
15

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

В мире нет пользователя, который сможет осмыслить или управлять этим набором данных, даже если вам технически удастся его отключить, вы не решите какую-либо известную проблему для этого пользователя.

Вместо этого я бы сосредоточился на том, почему пользователь хочет видеть данные. Пользователь не хочет видеть данные только для просмотра данных, обычно возникает вопрос. Если вы сосредоточитесь на ответе на эти вопросы, то вы бы гораздо ближе к чему-то, что решает настоящую проблему.

  • 14
    Мои пользователи - исследователи, которые привыкли к петабайтам данных. Я думаю, что знаю своих пользователей немного лучше, чем вы, хотя вы, безусловно, правы в общем случае. Что касается того, почему , эта сетка данных является просто частью набора инструментов для управления большими данными.
7

Я рекомендую Ext JS Grid с функцией Buffered View.

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

  • 0
    ExtJs, действительно. Это в основном построено специально для представления данных
  • 1
    ExtJs настолько хорош, что я хочу плакать, что он не построен на основе jQuery
Показать ещё 1 комментарий
6

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

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

О, и это абсолютно бесплатный открытый исходный код.

5

(Отказ от ответственности: я являюсь автором w2ui)

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

  • Высота div имеет предел (может быть преодолена виртуальной прокруткой)
  • Операции, такие как сортировка и поиск, начинают медленнее после 1 миллиона записей или около того
  • ОЗУ ограничено, поскольку данные хранятся в массиве JavaScript

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

  • 0
    С этой миллионной записью ваша html-страница имеет размер 3 МБ, но когда я загружаю свои данные, страница имеет размер 15 МБ, может ли w2ui справиться с этим? Мне нужны все данные для некоторых расчетов.
4

Я знаю, это старый вопрос, но все же. Существует также dhtmlxGrid, который может обрабатывать миллионы строк. Существует демо с 50 000 строк, но количество строк, которые могут быть загружены/обработаны в сетке, не ограничено.

Отказ от ответственности: я из команды DHTMLX.

  • 0
    Я хочу показать 10 МБ данных Json и хочу использовать их в расчетах, может ли DHTMLX сделать это, с этими данными и HTML-тегами страница моего браузера составляет около 15 МБ. Стоит ли использовать DHTMLX?
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

Я использовал jQuery Grid Plugin, это было приятно.

Демос

3

Я вроде как не вижу смысла, для jqGrid вы можете использовать виртуальную прокрутку:

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

но опять же можно сделать миллионы строк с фильтрацией:

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

Я действительно не вижу смысла "как будто нет страниц", хотя я имею в виду... нет способа отобразить в браузере 1 000 000 строк сразу - это 10 МБ HTML-кода, я вроде как не видят, почему пользователи не захотят видеть страницы.

В любом случае...

3
3

Отказ от ответственности: я тяжело использовать YUI DataTable без головной боли в течение длительного времени > . Он мощный и стабильный. Для ваших нужд вы можете использовать ScrollingDataTable, который поддерживает

  • х прокрутки
  • у прокрутки
  • ху прокрутки
  • Мощный механизм событий

Для чего вам нужно, я думаю, что вы хотите, это tableScrollEvent. Его API говорит

Запущен, когда прокрутка DataTable имеет прокрутку.

Поскольку каждый DataTable использует DataSource, вы можете отслеживать свои данные с помощью tableScrollEvent вместе с размером цикла визуализации, чтобы заполнить свой ScrollingDataTable в соответствии с вашими потребностями.

Размер кадра рендера говорит

В тех случаях, когда ваш DataTable должен отображать весь очень большой набор данных, config renderLoopSize может помочь управлять рендерингом DOM браузера, чтобы поток пользовательского интерфейса не блокировался на очень больших таблицах. Любое значение больше 0 приведет к выполнению рендеринга DOM в цепочках setTimeout(), которые отображают указанное количество строк в каждом цикле. Идеальное значение должно быть определено для каждой реализации, поскольку нет жестких и быстрых правил, только общие рекомендации:

  • По умолчанию renderLoopSize равно 0, поэтому все строки отображаются в одном цикле. В renderLoopSize > 0 добавляются служебные данные, поэтому используйте задумчиво.
  • Если ваш набор данных достаточно большой (количество строк X число сложности форматирования столбцов X), пользователи испытывают латентность визуального рендеринга и/или приводят к зависанию script рассмотрите настройку 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 > это всего лишь один DataSource. Это может быть JSON, JSFunction, XML и даже один элемент HTML

Здесь вы можете увидеть Простой учебник, предоставленный мной. Знать нет других DATA_TABLE pluglin поддерживает однократный и двойной щелчок одновременно. YUI DataTable позволяет вам. И еще, вы можете использовать его даже с JQuery без головной боли

В некоторых примерах вы можете увидеть

Не стесняйтесь спрашивать о чем-либо еще, что вы хотите о YUI DataTable.

С уважением,

2

Наилучший подход, о котором я мог думать, заключается в загрузке фрагмента данных в формате json для каждого прокрутки или некоторого предела до прокрутки. json можно легко преобразовать в объекты, и, следовательно, строки таблицы можно легко построить ненавязчиво.

  • 0
    Вот как у меня это. Запрос сделан для набора строк, отправленных обратно в JSON ... Я ищу рендерер на стороне клиента JavaScript, который поддерживает это!
  • 0
    Какие??? Какого черта "клиентский рендерер сайта"? Любой javascript все равно будет нуждаться в вызове ajax - так что вам все равно придется остановиться на каком-то транспортном формате. Вы не можете избежать делать какую-то работу Никто не сделает это для тебя, мой друг.
Показать ещё 2 комментария
1

Я знаю, что этот вопрос несколько лет, но jqgrid теперь поддерживает виртуальную прокрутку:

http://www.trirand.com/blog/phpjqgrid/examples/paging/scrollbar/default.php

но с отключением страницы

1

Я бы очень рекомендовал Open rico. Его трудно реализовать в начале, но как только вы его схватите, вы никогда не оглядитесь назад.

0

Взгляните на dGrid:

http://dojofoundation.org/packages/dgrid/

Я согласен с тем, что пользователи НИКОГДА НЕОБХОДИМО видеть все миллионы строк данных, но dGrid может быстро отображать их (экранный за раз).

Не кипятите океан, чтобы приготовить чашку чая.

0

Я предлагаю сигма-сетку, сигма-сетка имеет встроенные функции подкачки, которые могут поддерживать миллионы строк. Кроме того, для этого вам может понадобиться удаленный пейджинг. посмотреть демоверсию http://www.sigmawidgets.com/products/sigma_grid2/demos/example_master_details.html

Ещё вопросы

Сообщество Overcoder
Наверх
Меню