Necesito presentar una gran cantidad de filas de datos (es decir, millones de filas) al usuario en una cuadrícula usando JavaScript.
El usuario no debe ver páginas o ver solo cantidades finitas de datos a la vez.
Más bien, debería parecer que todos los datos están disponibles.
En lugar de descargar todos los datos de una vez, se descargan pequeños fragmentos a medida que el usuario se acerca a ellos (es decir, desplazándose por la cuadrícula).
Las filas no se editarán a través de este front-end, por lo que se aceptan cuadrículas de solo lectura.
¿Qué cuadrículas de datos, escritas en JavaScript, existen para este tipo de paginación perfecta?
Respuestas:
( Descargo de responsabilidad: soy el autor de SlickGrid )
ACTUALIZACIÓN Esto ahora se ha implementado en SlickGrid .
Consulte http://github.com/mleibman/SlickGrid/issues#issue/22 para una discusión continua sobre cómo hacer que SlickGrid funcione con un mayor número de filas.
El problema es que SlickGrid no virtualiza la barra de desplazamiento: la altura del área desplazable se establece en la altura total de todas las filas. Las filas se siguen agregando y eliminando a medida que el usuario se desplaza, pero el navegador realiza el desplazamiento en sí. Eso permite que sea muy rápido pero suave (los eventos de desplazamiento son notoriamente lentos). La advertencia es que hay errores / límites en los motores CSS de los navegadores que limitan la altura potencial de un elemento. Para IE, eso es 0x123456 o 1193046 píxeles. Para otros navegadores es más alto.
Hay una solución experimental en la rama "arreglo de largenum" que aumenta ese límite de manera significativa al llenar el área desplazable con "páginas" establecidas en 1 M de altura de píxeles y luego usar el posicionamiento relativo dentro de esas páginas. Dado que el límite de altura en el motor CSS parece ser diferente y significativamente más bajo que en el motor de diseño real, esto nos da un límite superior mucho más alto.
Todavía estoy buscando una manera de llegar a un número ilimitado de filas sin renunciar a la ventaja de rendimiento que SlickGrid tiene actualmente sobre otras implementaciones.
Rudiger, ¿puedes explicar cómo resolviste esto?
fuente
https://github.com/mleibman/SlickGrid/wiki
" SlickGrid utiliza renderizado virtual para permitirle trabajar fácilmente con cientos de miles de elementos sin ninguna caída en el rendimiento. De hecho, no hay diferencia en el rendimiento entre trabajar con una cuadrícula con 10 filas frente a 100,000 filas " .
Algunos puntos destacados:
Es gratis (licencia MIT). Utiliza jQuery.
fuente
data.length = Math.min(131000, parseInt(resp.total));
... Y, por supuesto, eso está codificado por una razón :(data
matriz. Es un error, pero tengo las respuestas que pueblan unabigdata
matriz, y lasdata
extracciones más pequeñas de labigdata
matriz. El resto del programa utiliza la matriz de datos más pequeña, a excepción de la medición de la barra de desplazamiento y algunos otros lugares que ahora están sin límites para una gran cantidad de filas. En general, fue mucho más fácil que escribir el mío.Las mejores cuadrículas en mi opinión están a continuación:
Mis 3 mejores opciones son jqGrid, jqxGrid y DataTables. Pueden trabajar con miles de filas y admitir la virtualización.
fuente
No pretendo comenzar una guerra de llamas, pero suponiendo que sus investigadores sean humanos, no los conoce tan bien como cree. El hecho de que tengan petabytes de datos no los hace capaces de ver incluso millones de registros de ninguna manera significativa. Podrían decir que quieren ver millones de discos, pero eso es una tontería. Haga que sus investigadores más inteligentes hagan algunas matemáticas básicas: suponga que pasan 1 segundo viendo cada registro. A ese ritmo, tomará 1000000 segundos, lo que equivale a más de seis semanas (de 40 horas semanales de trabajo sin descansos para la comida o el baño).
¿Ellos (o usted) piensan seriamente que una persona (la que mira la cuadrícula) puede reunir ese tipo de concentración? ¿Realmente están haciendo mucho en ese segundo o están (más probablemente) filtrando las cosas que no quieren? Sospecho que después de ver un subconjunto de "tamaño razonable", podrían describirle un filtro que filtraría automáticamente esos registros.
Como también implicaron paxdiablo y Sleeper Smith y Lasse V Karlsen, usted (y ellos) no han pensado en los requisitos. En el lado positivo, ahora que ha encontrado SlickGrid, estoy seguro de que la necesidad de esos filtros se hizo evidente de inmediato.
fuente
Ctrl+F
están los ordenamientos de columnas . La alternativa (paginación, búsqueda en el sitio web) es mucho peor. Solo mire StackOverflow cuando intente desplazarse por las preguntas o respuestas, Reddit para desplazarse por el historial de comentarios de un usuario. La clasificación y la búsqueda instantánea proporcionan el poder que tiene Windows Explorer, pero carecen de sitios web.Puedo decir con bastante certeza que realmente no es necesario mostrar millones de filas de datos al usuario.
No hay ningún usuario en el mundo que pueda comprender o administrar ese conjunto de datos, por lo que incluso si técnicamente logras llevarlo a cabo, no resolverás ningún problema conocido para ese usuario.
En cambio, me enfocaría en por qué el usuario quiere ver los datos. El usuario no quiere ver los datos solo para ver los datos, por lo general, se hace una pregunta. Si te enfocas en responder esas preguntas, entonces estarías mucho más cerca de algo que resuelva un problema real.
fuente
Recomiendo Ext JS Grid con la función Vista en búfer.
http://www.extjs.com/deploy/dev/examples/grid/buffer.html
fuente
(Descargo de responsabilidad: soy el autor de w2ui)
Recientemente escribí un artículo sobre cómo implementar la cuadrícula de JavaScript con 1 millón de registros ( http://w2ui.com/web/blog/7/JavaScript-Grid-with-One-Million-Records ). Descubrí que, en última instancia, hay 3 restricciones que evitan que se tome más alto:
He probado la cuadrícula con 1 millón de registros (excepto IE) y funciona bien. Vea el artículo para demostraciones y ejemplos.
fuente
dojox.grid.DataGrid ofrece una abstracción JS para datos para que pueda conectarla a varios backends con las tiendas dojo.data proporcionadas o escribir la suya propia. Obviamente, necesitará uno que admita acceso aleatorio para tantos registros. DataGrid también proporciona accesibilidad completa.
Edite, así que aquí hay un enlace al artículo de Matthew Russell que debería proporcionar el ejemplo que necesita, viendo millones de registros con dojox.grid. Tenga en cuenta que usa la versión anterior de la cuadrícula, pero los conceptos son los mismos, solo hubo algunas mejoras incompatibles de API.
Ah, y es de código abierto totalmente gratuito.
fuente
Utilicé jQuery Grid Plugin , fue agradable.
Población
fuente
Aquí hay un par de optimizaciones que puede aplicar para acelerar las cosas. Solo pensando en voz alta.
Dado que el número de filas puede ser de millones, querrá un sistema de almacenamiento en caché solo para los datos JSON del servidor. No puedo imaginar a nadie que quiera descargar todos los X millones de elementos, pero si lo hicieran, sería un problema. Esta pequeña prueba en Chrome para una matriz en enteros de 20M + se bloquea constantemente en mi máquina.
Podría usar LRU o algún otro algoritmo de almacenamiento en caché y tener un límite superior sobre la cantidad de datos que está dispuesto a almacenar en caché.
Para las celdas de la tabla en sí, creo que construir / destruir nodos DOM puede ser costoso. En su lugar, podría predefinir X número de celdas, y cada vez que el usuario se desplace a una nueva posición, inyecte los datos JSON en estas celdas. La barra de desplazamiento prácticamente no tendría relación directa con la cantidad de espacio (altura) que se requiere para representar todo el conjunto de datos. Puede establecer arbitrariamente la altura del contenedor de la tabla, digamos 5000 px, y asignarla al número total de filas. Por ejemplo, si la altura de los contenedores es de 5000 px y hay un total de 10M filas, entonces el
starting row ≈ (scroll.top/5000) * 10M
lugarscroll.top
representa la distancia de desplazamiento desde la parte superior del contenedor. Pequeña demostración aquí .Para detectar cuándo solicitar más datos, idealmente un objeto debe actuar como un mediador que escucha los eventos de desplazamiento. Este objeto realiza un seguimiento de qué tan rápido se está desplazando el usuario, y cuando parece que el usuario se está desacelerando o se ha detenido por completo, realiza una solicitud de datos para las filas correspondientes. Recuperar datos de esta manera significa que sus datos estarán fragmentados, por lo que el caché debe diseñarse teniendo esto en cuenta.
También los límites del navegador en las conexiones salientes máximas pueden jugar un papel importante. Un usuario puede desplazarse a una determinada posición que disparará una solicitud AJAX, pero antes de que finalice, el usuario puede desplazarse a otra parte. Si el servidor no responde lo suficiente, las solicitudes se pondrán en cola y la aplicación no responderá. Puede usar un administrador de solicitudes a través del cual se enrutan todas las solicitudes, y puede cancelar las solicitudes pendientes para hacer espacio.
fuente
Sé que es una pregunta antigua, pero aún así ... También hay dhtmlxGrid que puede manejar millones de filas. Hay una demostración con 50,000 filas, pero el número de filas que se pueden cargar / procesar en la cuadrícula es ilimitado.
Descargo de responsabilidad: soy del equipo DHTMLX.
fuente
Te sugiero que leas esto
http://www.sitepen.com/blog/2008/11/21/effective-use-of-jsonreststore-referencing-lazy-loading-and-more/
fuente
Descargo de responsabilidad: uso mucho YUI DataTable sin dolor de cabeza durante mucho tiempo . Es poderoso y estable. Para sus necesidades, puede utilizar un ScrollingDataTable suports wich
Para lo que necesitas, creo que lo que quieres es un tableScrollEvent . Su API dice
Como cada DataTable usa un DataSource, puede monitorear sus datos a través de tableScrollEvent junto con el tamaño del bucle de renderizado para completar su ScrollingDataTable de acuerdo con sus necesidades.
El tamaño del bucle de procesamiento dice
Por ejemplo
<WHERE_DOES_THE_DATA_COME_FROM> es solo un único DataSource . Puede ser un JSON, JSFunction, XML e incluso un solo elemento HTML
Aquí puedes ver un tutorial simple, provisto por mí. Tenga en cuenta que ningún otro plugin DATA_TABLE admite clics simples y dobles al mismo tiempo. YUI DataTable te permite. Y más, puedes usarlo incluso con JQuery sin dolor de cabeza
Algunos ejemplos, puedes ver
Siéntase libre de preguntar sobre cualquier otra cosa que desee sobre YUI DataTable.
Saludos,
fuente
De alguna manera no veo el punto, para jqGrid puedes usar la funcionalidad de desplazamiento virtual:
http://www.trirand.net/aspnetmvc/grid/performancevirtualscrolling
pero, de nuevo, se pueden hacer millones de filas con filtrado:
http://www.trirand.net/aspnetmvc/grid/performancelinq
Sin embargo, realmente no veo el punto de "como si no hubiera páginas", quiero decir ... no hay forma de mostrar 1,000,000 de filas a la vez en el navegador - esto es 10MB de HTML sin procesar, no veo por qué los usuarios no querrían ver las páginas.
De todas formas...
fuente
El mejor enfoque que se me ocurre es cargar la porción de datos en formato json para cada desplazamiento o algún límite antes de que finalice el desplazamiento. json se puede convertir fácilmente en objetos y, por lo tanto, las filas de la tabla se pueden construir fácilmente de manera discreta
fuente
Recomiendo encarecidamente Open rico . Es difícil de implementar al principio, pero una vez que lo agarres, nunca mirarás hacia atrás.
fuente
Sé que esta pregunta tiene algunos años, pero jqgrid ahora admite el desplazamiento virtual:
http://www.trirand.com/blog/phpjqgrid/examples/paging/scrollbar/default.php
pero con paginación deshabilitada
fuente
Sugiero sigma grid, sigma grid ha incorporado funciones de paginación que podrían admitir millones de filas. Y también, es posible que necesite una paginación remota para hacerlo. vea la demostración http://www.sigmawidgets.com/products/sigma_grid2/demos/example_master_details.html
fuente
Echa un vistazo a dGrid:
https://dgrid.io/
Estoy de acuerdo en que los usuarios NUNCA, NUNCA necesitarán ver millones de filas de datos a la vez, pero dGrid puede mostrarlos rápidamente (una pantalla a la vez).
No hiervas el océano para hacer una taza de té.
fuente