数百万行のJavaScriptデータグリッド[終了]


225

JavaScriptを使用して、グリッド内の多数のデータ行(つまり、数百万行)をユーザーに提示する必要があります。

ユーザーは、一度にページを表示したり、有限量のデータのみを表示したりすることはできません。

むしろ、すべてのデータが利用可能であるように見えるはずです。

データを一度にダウンロードする代わりに、ユーザーがグリッドにスクロールすることにより、小さなチャンクがダウンロードされます。

このフロントエンドでは行は編集されないため、読み取り専用グリッドを使用できます。

この種のシームレスなページングのために、JavaScriptで記述されたどのデータグリッドが存在しますか?


1
大規模なデータセットでは失敗するようなので、jqgridの回答を受け入れませんでした...他に何か提案はありますか?何についてext-livegrid.com
Rudiger

6
自分で書いてください。他のものはDOMに追加し続けるだけなので、窒息していると思います。画面からスクロールて行を削除するソリューションが必要になると思います。それが唯一の方法です。DOMに100万のテーブル行を置くことはできず、すべてのブラウザーがすべての環境でシームレスに表示およびスクロールすることを期待できます。合理的である。
Josh Stodola

2
@Rudiger:SlickGridが無制限の行数をネイティブでサポートするようになりました。github.com/mleibman/SlickGrid/tree/unlimited-rowsを参照してください。これが完全にテストされると、メインブランチにマージされます。
Tin

10
そして、私はあなたがこれまで働いてきたどの会社も残念です。ちなみに、100万行しか表示されていない1920x1080画面では、スクロールバーの1ピクセルの動きごとに20行ジャンプします。時間を無駄にする代わりに、ユーザビリティテストを行ってください。
スリーパースミス

2
この質問とそのトップ2の回答(少なくとも)は非常に役に立ちます。質の低い回答がいくつか寄せられた可能性がありますが、決してこの質問をクローズするべきではありません。SlickGridを使用してこの問題を解決すると、人々が自分でこれを再実装しようとすると、何時間ものトラブルと難しいコーディングを節約できます。
Sam Watkins

回答:


190

免責事項:私はSlickGridの作者です

UPDATE これはSlickGridに実装されました

より多くの行でSlickGridを機能させることに関する進行中の議論については、http://github.com/mleibman/SlickGrid/issues#issue/22を参照してください

問題は、SlickGridがスクロールバー自体を仮想化しないことです。スクロール可能な領域の高さは、すべての行の合計の高さに設定されます。ユーザーがスクロールしている間、行は引き続き追加および削除されますが、スクロール自体はブラウザーによって行われます。これにより、非常に高速でスムーズになります(オンスクロールイベントは非常に低速です)。要素の潜在的な高さを制限するブラウザのCSSエンジンにはバグ/制限があるという警告があります。IEの場合、これはたまたま0x123456または1193046ピクセルです。他のブラウザの場合、それはより高いです。

「largenum-fix」ブランチには実験的な回避策があり、スクロール可能領域に「ページ」を高さ1Mピクセルに設定し、それらのページ内での相対位置を使用することで、制限を大幅に引き上げています。CSSエンジンの高さ制限は実際のレイアウトエンジンとは異なり、かなり低いように見えるため、これによりはるかに高い上限が得られます。

SlickGridが現在他の実装よりも優れているパフォーマンスエッジを放棄することなく、無制限の行数に到達する方法を探しています。

ルディガー、これをどのように解決したか詳しく説明できますか?


1
SlickGridが最も魅力的であることがわかりました-特にjQueryを使用している場合はそうです。おめでとうございます!(特に素晴らしい態度と粘り強さのために。):-)
Andras Vass

私はslickgridを使用してExcelヘッダーを表示しようとしていますが、列が多すぎると、slickgridは行のスクロールのみを最適化し、列のスクロールは最適化しないことがわかりました。120列以上ある場合、slickgridは新しい行を新しい行に配置することにも気付きました。最大行数をファイルのどこかに設定できますか?
oneiros

1
SlickGrid v2.1は、列だけでなく行にも仮想スクロールを使用しています。また、オーバーフロー列の問題が解決されました。

@Tin-これは私のアプローチに似ています。私は自分の時代より何年も前でした!「無限スクロールをWebアプリケーションに組み込むための遅延ブロックレイアウトプリミティブ。」docs.google.com/document/d/…–
Rudiger

@Rudigerはい、1か月前に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配列の長さに依存しないグリッドにするためにいくつかの変更を加えました。それはkludgeですが、私はbigdata配列にデータを投入する応答を持っています、そして配列dataからのより小さなプルbigdata。プログラムの残りの部分では、スクロールバーの測定と、他のいくつかの場所で多数の行が無制限になっている場合を除いて、小さいデータ配列を使用します。全体として、自分で書くよりはるかに簡単でした。
Rudiger

8
@Rudiger:SlickGridが無制限の行数をネイティブでサポートするようになりました。github.com/mleibman/SlickGrid/tree/unlimited-rowsを参照してください。これが完全にテストされると、メインブランチにマージされます。
Tin

私はslickgridを使用してExcelヘッダーを表示しようとしていますが、列が多すぎると、slickgridは行のスクロールのみを最適化し、列のスクロールは最適化しないことがわかりました。120列以上ある場合、slickgridは新しい行を新しい行に配置することにも気付きました。最大行数をファイルのどこかに設定できますか?
oneiros 2012

本当に高速なものが必要な場合は、jqueryを使用してコアの処理を行うものに依存せず、DOMの追加ではなくinnerHTMLを使用してください。JavaScriptのスクロールバーは、遅いコンピューターではブラウザーのスクロールバーよりも著しく遅くなる可能性があり、複雑なcssルールを回避するため、単一行のレイアウトを簡略化するために時間を費やす必要があります。この場合、マイクロ最適化が重要になる可能性があります。これは、パフォーマンスを向上させるための単なる一般的な考え方です。jsPerf.comはあなたの友達です。
Vitim.us

37

私の意見で最高のグリッドは以下のとおりです。

私の最高の3つのオプションは、jqGrid、jqxGrid、DataTablesです。彼らは何千もの行で動作し、仮想化をサポートできます。


1
リストの+1ですが、比較に関してはそれほど多くありません。良いスタートは、それぞれのコミット数を追加することです-現在のところFlexigridの場合33、SlickGridの場合491。
Dan Dascalescu

12
Screw SOの5分間のコメント編集制限。#1-jqGrid- 1000以上のコミット ; #2-752(DataTablesの場合)#3-491(SlickGridの場合)#4-33 Flexigridのコミット。イングリッド- 2011年6月以降更新なし。jqGridView - 2009年以来更新なし
ダンDascalescu

3
前のコメントに基づいて、プロジェクトごとのフォークの数をここに含めます。#1-SlickGrid-670フォーク。#2-jqGrid-358フォーク; #3-Flexigrid-238; #4-DataTables-216; #5-イングリッド-41; #6-jqGridView-0;
ljs.dev 2013年


Slickgridはまだ健在ですが、上記のmleibmanリポジトリは機能していません。新しいリンク:github.com/6pac/SlickGrid(mleibmanが彼のリポジトリの最後のメモでそれを参照)、またはwww.slickgrid.net
Ben McIntyre

25

私は炎の戦争を始めるつもりはありませんが、あなたの研究者が人間であると仮定すると、あなたは彼らをあなたが思っているほど知りません。ペタバイトのデータがあるからといっ、何百万ものレコードを意味のある方法で表示することはできません。何百万ものレコードを見たいと言うかもしれませんが、それはばかげています。賢い研究者に基本的な計算をしてもらいます。各レコードの閲覧に1秒かかると仮定します。そのレートでは、1000000秒かかります。これは6週間以上になります(40時間の労働週のうち、食物や洗面所の休憩がない場合)。

彼ら(またはあなた)は、1人(グリッドを見ている人)がそのような集中力を発揮できると真剣に考えていますか?彼らは本当に1秒間で多くのことを成し遂げているのでしょうか、それとも、(おそらく)不要なものをフィルターで除外してますか?「適度なサイズ」のサブセットを表示した後、それらはそれらのレコードを自動的にフィルターで除外するフィルターを説明できると思います。

paxdiablo、Sleeper Smith、Lasse V Karlsenもほのめかしたように、あなた(そして彼ら)は要件を熟考していません。良い面としては、SlickGridを見つけたので、これらのフィルターの必要性がすぐに明らかになったと思います。


2
何百万もの行が必要なのは、常にそれらを表示することではありません。クライアントは、独自のデータ分析システムで実行するために、レコードの部分的なダンプを必要とする場合があります。
cbmeeks 2012年

10
独自の分析のためのデータダンプの場合、Webページのグリッドに表示されないでしょうか。
スティーブンベニテス2013

5
一度に全部見る必要はありません。これが列の並べ替えのCtrl+F目的です。別の方法(ページング、Webサイト検索)の方がはるかに悪いです。質問や回答をスクロールしようとするときはStackOverflowを、ユーザーのコメント履歴をスクロールするにはRedditを見てください。並べ替えとインスタント検索は、Windowsエクスプローラーにはある機能を提供しますが、Webサイトにはありません。
Ian Boyd 2014

15

何百万ものデータ行をユーザーに真剣に示す必要がないことは確かです。

そのデータセットを理解または管理できるユーザーは世界中にいないため、技術的に管理できても、そのユーザーの既知の問題を解決することはできません。

代わりに、ユーザーがデータを見たい理由に焦点を当てます。ユーザーはデータを見るためだけにデータを見たいわけではありません。通常、質問されます。代わりにこれらの質問への回答に焦点を合わせると、実際の問題を解決する何かにはるかに近くなります。


16
私のユーザーはペタバイト規模のデータに慣れている研究者です。私はユーザーがあなたよりも少しよく知っていると思いますが、あなたは確かに一般的なケースでは正しいです。なぜ、このデータグリッドは、単にビッグデータを管理するためのツールセットの一部です。
Rudiger、2010年

7

バッファービュー機能を備えたExt JSグリッドをお勧めします。

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


ExtJs、確かに。基本的には、特にデータプレゼンテーション用に構築されています
KdgDev 2010年

1
ExtJsはとても良かったので、jQueryの上に構築されていないほど泣きたい
James Westgate

これで、ExtJSのグリッド関連部分のみをロードできるので、ExtJSグリッドをアプリケーションに追加してもそれほど重くなりません。ただし、外観の違いを考慮して、そのコンポーネントだけにExtJSのテーマを使用する必要があります。
JD Smith

7

(免責事項:私はw2uiの作成者です)

100万レコードのJavaScriptグリッドを実装する方法についての記事を最近書きました(http://w2ui.com/web/blog/7/JavaScript-Grid-with-One-Million-Records)。私は最終的にそれを高くすることを防ぐ3つの制限があることを発見しました:

  1. divの高さには制限があります(仮想スクロールで克服できます)
  2. 並べ替えや検索などの操作が100万件ほどのレコードの後に​​遅くなる
  3. データはJavaScript配列に格納されるため、RAMは制限されています

100万レコード(IEを除く)でグリッドをテストしましたが、うまく機能します。デモと例については、記事を参照してください。


この100万レコードのHTMLページのサイズは3MBですが、データをロードすると、ページは15MBですが、w2uiはそれを処理できますか?一部の計算にすべてのデータが必要です。
Chetan S. Choudhary 2016

6

dojox.grid.DataGridは、データのJS抽象化を提供するため、提供されたdojo.dataストアを使用してさまざまなバックエンドにフックしたり、独自のストアを記述したりできます。この数のレコードのランダムアクセスをサポートするものが明らかに必要です。DataGridは完全なアクセシビリティも提供します。

編集して、dojox.gridで何百万ものレコードを表示し、必要な例を提供するMatthew Russellの記事へのリンクを示します。グリッドの古いバージョンを使用していますが、概念は同じで、互換性のないAPIの改善がいくつかあったことに注意してください。

ああ、それは完全に無料のオープンソースです。



4

ここでは、スピードアップのために適用できるいくつかの最適化を示します。大声で考えてください。

行の数は数百万になる可能性があるため、サーバーからのJSONデータ専用のキャッシュシステムが必要になります。X万アイテムすべてをダウンロードしたいと思う人は想像できませんが、ダウンロードしたとしても問題になります。20M以上の整数の配列に対するChromeでのこの小さなテストは、私のマシンで常にクラッシュします。

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

あなたは使うことができLRUまたはいくつかの他のキャッシュアルゴリズムをと上あなたがキャッシュに喜んでどのくらいのデータにバインドされています。

テーブルセル自体については、DOMノードの構築/破棄にはコストがかかると思います。代わりに、X個のセルを事前定義し、ユーザーが新しい位置にスクロールするたびに、JSONデータをこれらのセルに挿入することができます。スクロールバーは、データセット全体を表すために必要なスペース(高さ)と実質的に直接の関係はありません。テーブルコンテナーの高さ(5000pxなど)を任意に設定し、それを行の総数にマッピングできます。たとえば、コンテナの高さが5000pxで、合計行数が10M行の場合、starting row ≈ (scroll.top/5000) * 10Mwhere scroll.topはコンテナの上部からのスクロール距離を表します。ここに小さなデモがあります

追加のデータを要求するタイミングを検出するには、理想的には、オブジェクトがスクロールイベントをリッスンするメディエーターとして機能する必要があります。このオブジェクトは、ユーザーがスクロールしている速さを追跡し、ユーザーがスローダウンしているように見えたり、ユーザーが完全に停止したりすると、対応する行に対してデータ要求を行います。この方法でデータを取得することは、データが断片化されることを意味するため、キャッシュはそれを考慮して設計する必要があります。

また、最大発信接続のブラウザ制限は重要な役割を果たす可能性があります。ユーザーはAJAXリクエストを発生させる特定の位置にスクロールできますが、それが完了する前にユーザーは他の部分にスクロールできます。サーバーが十分に応答しない場合、リクエストはキューに入れられ、アプリケーションは応答していないように見えます。すべてのリクエストがルーティングされるリクエストマネージャを使用でき、保留中のリクエストをキャンセルしてスペースを確保できます。


4

古い質問であることはわかっていますが、それでも何百万もの行を処理できるdhtmlxGridもあります。50,000行のデモがありますが、グリッドにロード/処理できる行の数は無制限です。

免責事項:私はDHTMLXチームの出身です。


10 MBのJsonデータを表示し、それを計算で使用したいのですが、DHTMLXでそれを実行できます。そのデータとhtmlタグを使用すると、ブラウザーのページは約15 MBになります。DHTMLXを使用する価値はありますか?
Chetan S. Choudhary 2016


3

免責事項:私はYUI DataTable を長い間頭痛のない状態で頻繁に使用しています 。強力で安定しています。あなたのニーズに合わせて、あなたが使用することができますScrollingDataTableウィッヒsuportsはを

  • Xスクロール
  • Yスクロール
  • xyスクロール
  • 強力なイベントメカニズム

必要なものについては、tableScrollEventが必要だと思います。そのAPIは言う

固定スクロールDataTableにスクロールがあるときに発生します。

各DataTableはDataSourceを使用するため、必要に応じてScrollingDataTable データを入力するために、レンダリングループサイズとともに tableScrollEventを介してデータ監視できます。

レンダーループサイズは言う

DataTableが非常に大きなデータセット全体を表示する必要がある場合、renderLoopSize構成、ブラウザーのDOMレンダリングの管理に役立ち、UIスレッドが非常に大きなテーブルでロックされないようにします。0より大きい値を指定すると、DOMレンダリングは、各ループで指定された行数をレンダリングするsetTimeout()チェーンで実行されます。厳密な規則はなく、一般的なガイドラインのみがあるため、理想的な値は実装ごとに決定する必要があります。

  • デフォルトではrenderLoopSizeは0なので、すべての行が単一のループでレンダリングされます。renderLoopSize> 0はオーバーヘッドを追加するため、慎重に使用してください。
  • データのセットが十分に大きい場合(行数X列数Xのフォーマットの複雑さ)、ユーザーが視覚レンダリングで遅延を経験したり、スクリプトがハングしたりする場合は、renderLoopSizeの設定を検討してください
  • 50未満のrenderLoopSizeはおそらく価値がありません。renderLoopSize> 100の方が良いでしょう。
  • データセットは、数百および数百の行がない限り、おそらく十分な大きさとは見なされません。
  • renderLoopSize> 0および<合計行があると、テーブルは1つのループでレンダリングされます(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行を表示する方法はありません。これは10MBの未加工のHTMLなので、見落とします。ユーザーがページを見たくない理由。

とにかく...


2

私が考えることができる最良のアプローチは、スクロールが終了する前に、すべてのスクロールまたはいくつかの制限についてjson形式でデータのチャンクをロードすることです。jsonはオブジェクトに簡単に変換できるため、テーブルの行を目立たずに簡単に構築できます


それは私がそれを持っている方法です。JSONで送り返された一連の行を要求します...これをサポートするJavaScriptクライアント側レンダラーを探しています!
Rudiger

何???「クライアントサイトレンダラー」とは一体何ですか?javascriptは引き続きajax呼び出しを行う必要があります。そのため、何らかのトランスポート形式で解決する必要があります。仕事をして逃げられない。誰もあなたのためにこれを私の友人にすることはありません。
Andriy Drozdyuk

1
AJAX呼び出しを行う必要があることは知っています。この部分は簡単です。クライアントは "start = 20&limit = 20"のようなものを要求し、サーバーから行20〜39を取得します(XMLまたはJSON形式)。「クライアント側レンダラー」(私の用語!)は、これらの要求をインテリジェントに(たとえば、ユーザーが下にスクロールすると)行い、結果をきれいなグリッドにシームレスにレンダリングします。あなたの言うことに反して、誰か他の人が私のためにこの仕事をしてくれました。これが、この質問に対する他のすべての回答です。
Rudiger、2010年

まあ、それはあなたのために誰もそれをしていないようです:)
Andriy Drozdyuk 2010年

1

Open ricoを強くお勧めします。最初は実装するのは難しいですが、一度取得すると、決して振り返ることはありません。




0

dGridを見てください。

https://dgrid.io/

ユーザーが決して何百万ものデータ行を一度に表示する必要は決してないことに同意しますが、dGridはそれらをすばやく(一度に1画面ずつ)表示できます。

お茶を作るために海を沸騰させないでください。


あなたのお茶(リンク)が見つかりません。:)
Akshay

現在、独自のサイトを持っています:)
ColemanTO
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.