2010-01-13 14 views
5

Quiero mostrarle a un usuario un archivo de texto grande (100 MB de archivos de registro específicamente) a través de una interfaz web sin que el usuario tenga que descargar todo el archivo. Obviamente, devolver el archivo completo al navegador web de alguien no sería sensato, así que mi teoría era usar Ajax para buscar porciones del archivo dependiendo del usuario que se desplaza por el archivo, similar a la forma en que Google Maps proporciona una "ventana" del mapa .Mostrar archivos de texto grandes a través de Ajax/dojo

Mi servidor de aplicaciones es PHP, y estoy bastante seguro de que puedo realizar las búsquedas y lecturas apropiadas a través del archivo y devolver los resultados mediante XHR a la aplicación, pero mi framework Ajax es dojo y no puedo pensar en ningún dijit estándar eso funcionaría y estoy tratando de descubrir qué mejor sería poner en práctica algo.

¿Debo obtener mi propio widget? ¿Hay algo que yo desconozca? Si construyo mi propio widget personalizado, ¿qué tipo de estructura debería tomar y existen buenos recursos para desarrollar widgets personalizados para dojo/dijit? ¿Algún otro pensamiento?

Respuesta

1

This seems to be a tut on what you might need Le sugiero que use un li, porque terminará queriendo realizar algunas acciones en cada línea, lo más probable es que cada línea sea relevante.

El desplazamiento es agradable, pero también puede ajustar la interfaz con paginación, lo que significa que hacen clic en la página siguiente, página anterior, y la busca, luego actualiza la vista. Ese es el método más fácil. Con el desplazamiento, tendrá que obtener más por encima y por debajo de las líneas visibles actuales para un desplazamiento continuo.

Por ejemplo, si desea mostrar 25 líneas, deberá buscar 25 + pad inferior en el primer intento, y definir las líneas que muestran en el panel inferior como el umbral para señalar un nuevo evento para descargar un extra Más de 25 elementos de almohadilla inferior.

Con un archivo de 100mb, va a ser lento pronto, por lo que tendrá que borrar las entradas anteriores, y definir un nuevo panel superior para señalar una solicitud para obtener el reverso. Es decir, 1ª necesidad: obtener 25 + almohadilla inferior, 2ª búsqueda buscar 25 + almohadilla inferior eliminar prev 25 - almohadilla superior.

Una cosa a tener en cuenta es que, al hacer esto, al menos en firefox, puede tender a ser inestable y no desencadenar eventos después de algunas cargas, por lo que es posible que desee desvincular a sus oyentes pares.Solo digo esto porque tengo un amigo que actualmente está trabajando en algo con funcionalidades similares, y estos son algunos de los problemas con los que se encontró.

Nadie se va a quejar de que tienen que hacer clic en la página siguiente/página anterior, será rápido y limpio, pero estropeará su desplazamiento y nadie querrá usar su widget.

Éstos son algunos otros recursos sobre el tema: Old Ajax Scrollable Table-Twitter like load more tut - Good scrolling example, read the source-Check out this googlecode project

+0

Interesante pensamiento sobre la paginación. Honestamente, no lo había pensado (y no sé por qué). Gracias por el tutor y un bosquejo aproximado de lo que tendría que hacerse y una alternativa potencialmente viable. – Kitson

+0

Me alegra ayudar, y no se preocupe por las características elegantes, la funcionalidad es mi lema en primer lugar. ¡Buena suerte en tu proyecto! –

0

Si el archivo de registro es un archivo de texto con una terminación de línea consistente, tal vez puede buscarlo por número de línea.

tengo idea con el algoritmo de la siguiente manera:

  1. Cuando página cargada, ir a buscar primero la línea 100 del archivo. póngalo en algún contenedor, tal vez en un div, textarea, o usando <ul><li>
  2. Ponga un controlador de eventos para saber que el usuario se ha desplazado a la última parte del contenedor.
  3. Enviar solicitud AJAX para obtener las siguientes 100 líneas del archivo. Pase el offset de línea como parámetro (GET o URI Parameter) para que el script PHP pueda obtener la parte correcta del archivo
  4. Ponga la respuesta AJAX al final del contenedor, actualice el siguiente desplazamiento de solicitud AJAX.
  5. Si no quedan más líneas en el archivo, devuelva una respuesta vacía. El manejador de AJAX debería considerar esto como el final del archivo, por lo que eliminará el controlador de eventos en el paso 2 anterior.

No sé mucho sobre Dojo. Uso jquery tools's scrollable en mi aplicación. Es fácil poner un controlador de eventos cuando el desplazamiento llega a la última página, luego buscar el siguiente elemento.

+0

Sí, esto es similar a lo que estaba pensando, pero si sigo cargando y cargando objetos en la memoria del navegador, eventualmente explotaré. Pensaría que tendría que preocuparme por descargar los objetos. dojo tiene un objeto similar llamado 'dojox.layout.ScrollPane'. Podría ser capaz de sacar algo de eso. – Kitson

1

recomiendo el almacenamiento en caché.

Debe tenerse en cuenta que la solución a este problema debe tener en cuenta que leer un archivo suficientemente grande (100mb +) del disco va a estar enlazado al disco y es probable que supere el tiempo de espera que su servidor web hora. Para evitar que el usuario espere demasiado tiempo para cargar cualquier parte del archivo, evitaría los ataques como cambiar los límites de tiempo de espera de su servidor.

Aquí hay una posible solución que viene a la mente: 1) Guarde en caché el archivo dividiéndolo en archivos separados. Puede hacer esto fácilmente en un trabajo cron o incluso desencadenarlo cuando se escribe el archivo. Use readfile_chunked (http://cn2.php.net/manual/en/function.readfile.php#48683) o similar.

2) Escriba un script de controlador de servicio que cuando se invoca desde el navegador (digamos './readfile?chunk=##') devuelve el fragmento solicitado.

3) Utilice una paginación widgit o una rueda de desplazamiento según lo sugerido por el otro colaborador para realizar la llamada al manejador de servicios a través de AJAX.

Contras: Esto aumentará inevitablemente la cantidad de espacio en disco. Pros: Se optimizarán los usuarios felices ya que el acceso al disco y el tiempo de ejecución del script se optimizarán. Además, se escala bien. (del orden de O (n)).

+0

Aunque es interesante, especialmente el "readfile_chunked", voy a investigarlo. El problema es que habrá en el rango de 160,000 archivos de registro de ese tipo, de los cuales solo 10-20 serán considerados por quizás 5-10 usuarios. Ya tengo un proceso que los indexa de manera significativa, pero quiero proporcionar una forma de ver los registros sin necesidad de descargar el archivo localmente y encontrar las 20 o 30 líneas que el usuario está buscando. – Kitson

1

¿Ha considerado usar Dojo Grid para ver los registros? Tiene soporte incorporado para la carga dinámica de 'páginas', es decir, filas de datos.

+0

Lo consideré ... Es demasiado complejo para lo que necesito y hay algunos elementos de la interfaz de usuario que no se prestan a funcionar de la manera que necesito, pero es gracioso que lo menciones, porque Decidí seguir adelante con la redacción de un widget y un almacén de datos dojo personalizados que hacen lo que necesito y descubrí que 'dojox.grid._Scroller' que es parte de la cuadrícula es muy similar a lo que necesito y estoy tomando muchas pistas de ello. – Kitson

Cuestiones relacionadas