Сетка данных 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/issues#issue/22 для постоянной дискуссии о внесении SlickGrid работы с большим числом строк.

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

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

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

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

Банка
источник
1
Я считаю SlickGrid наиболее привлекательным, особенно если он работает с jQuery. Congrats! (особенно за отличное отношение и настойчивость.) :-)
Андрас Васс
Я пытаюсь использовать 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 строк ».

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

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

Это бесплатно (лицензия 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 append. Полосы прокрутки Javascript могут быть заметно медленнее полос прокрутки браузера на медленных компьютерах, избегать сложных правил CSS, и вам следует потратить время на упрощение макета одной строки. Микро-оптимизации могут быть значительными в этом случае. Это всего лишь общие правила улучшения производительности. jsPerf.com твой друг.
Vitim.us
37

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

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

Scripto
источник
1
+1 за список, хотя для сравнения не так много. Хорошим началом было бы добавить количество коммитов для каждого - 33 для Flexigrid на данный момент, против 491 для SlickGrid.
Дан Даскалеску
12
Винт SO 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 - DataTables - 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 часов рабочей недели без перерывов на еду или уборную).

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

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

Дэниел Данг Гриффит
источник
2
Потребность в миллионах строк не всегда связана с их просмотром. Иногда клиенты хотят частичный дамп записей для запуска в своих собственных системах анализа данных.
cbmeeks
10
Если это дамп данных для собственного анализа, то он не будет отображаться в сетке на веб-странице, не так ли?
Стивен Бенитес
5
Мне не нужно видеть их всех сразу. Вот для чего колонка сортируется и Ctrl+Fдля чего. Альтернатива (пейджинг, поиск по сайту) намного хуже. Просто посмотрите на StackOverflow при попытке прокручивать вопросы или ответы, Reddit для прокрутки истории комментариев пользователя. Сортировка и мгновенный поиск дают возможность Windows Explorer, но веб-сайтам не хватает.
Ян Бойд
15

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

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

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

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

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

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

richardtallent
источник
ExtJs, действительно. Это в основном построено специально для представления данных
KdgDev
1
ExtJs настолько хорош, что хочется плакать, что он не построен на основе jQuery
Джеймс Вестгейт,
Теперь вы можете загружать только части ExtJS, связанные с сеткой, так что добавление сетки ExtJS в ваше приложение не будет слишком тяжелым. Тем не менее, вы все равно должны учитывать различия во внешнем виде и использовать способ создания тем ExtJS только для этого компонента.
ДжейДи Смит
7

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

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

  1. Высота div имеет ограничение (может быть преодолено с помощью виртуальной прокрутки)
  2. Такие операции, как сортировка и поиск, начинают выполняться медленно после 1 миллиона записей или около того
  3. Объем оперативной памяти ограничен, поскольку данные хранятся в массиве JavaScript

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

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

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

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

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

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

Чтобы определить, когда запрашивать больше данных, в идеале объект должен действовать как посредник, который прослушивает события прокрутки. Этот объект отслеживает, как быстро пользователь выполняет прокрутку, и когда он выглядит так, как будто пользователь замедляется или полностью остановился, выполняет запрос данных для соответствующих строк. Получение данных таким способом означает, что ваши данные будут фрагментированы, поэтому кэш должен быть спроектирован с учетом этого.

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

Анураг
источник
4

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

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

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

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

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

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

Вызывается, когда прокрутка DataTable с фиксированной прокруткой.

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

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

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

  • По умолчанию renderLoopSize равен 0, поэтому все строки отображаются в одном цикле. RenderLoopSize> 0 добавляет накладные расходы, поэтому используйте их вдумчиво.
  • Если ваш набор данных достаточно велик (количество строк X, число столбцов X, сложность форматирования), что пользователи испытывают задержку при визуальном рендеринге и / или это приводит к зависанию сценария, рассмотрите возможность установки renderLoopSize .
  • RenderLoopSize до 50, вероятно, не стоит. RenderLoopSize> 100, вероятно, лучше.
  • Набор данных, вероятно, не считается достаточно большим, если в нем нет сотен и сотен строк.
  • Наличие renderLoopSize> 0 и <total строк приводит к тому, что таблица отображается в одном цикле (так же, как 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 не поддерживает одиночный и двойной щелчок одновременно. 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, я вроде не вижу почему пользователи не хотят видеть страницы.

Тем не мение...

user125775
источник
2

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

кодировщик
источник
Вот как у меня это. Запрос сделан для набора строк, отправленных обратно в JSON ... Я ищу рендерер на стороне клиента JavaScript, который поддерживает это!
Рудигер
Какой??? Какого черта "клиент сайта рендерер"? Любой javascript все равно будет нуждаться в вызове ajax - так что вам все равно придется остановиться на каком-то транспортном формате. Вы не можете избежать делать какую-то работу Никто не сделает это для тебя, мой друг.
Андрей Дроздюк
1
Я знаю, что нужно сделать AJAX-вызов; эта часть проста. Клиент запрашивает что-то вроде «start = 20 & limit = 20» и получает строки 20–39 с сервера (в формате XML или JSON). «Средство рендеринга на стороне клиента» (моя терминология!) Делает эти запросы интеллектуально (например, когда пользователь прокручивает страницу вниз) и визуально отображает результаты в красивой сетке. Вопреки тому, что вы говорите, кто-то другой сделал эту работу для меня. Это то, что все остальные ответы на этот вопрос.
Рудигер
Что ж, кажется, никто "еще" не сделал это для вас :)
Андрей Дроздюк
1

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

mosid
источник
0

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

https://dgrid.io/

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

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

ColemanTO
источник
Ваша чашка чая (ссылка) не найдена. :)
Акшай
Теперь у него есть собственный сайт :)
ColemanTO