2011-10-11 28 views
5

Estoy usando el paquete de agilidad html para analizar páginas individuales de un sitio web del foro. Entonces, el método de análisis devuelve todos los enlaces tema/hilo en el enlace de la página, pasado como un argumento. Recojo todos estos enlaces de tema de todas las páginas analizadas en una sola colección.¿Cómo se puede paralelizar mejor el análisis sintáctico de páginas web?

Después de eso, verifico si están en mi Dictionary de las URL ya vistas, y si no lo están, entonces las agrego a una nueva lista y la UI muestra esta lista, que básicamente es temas nuevos/hilos creados desde la última vez.

Dado que todas estas operaciones parecen independientes, ¿cuál sería la mejor manera de paralelizar esto?

¿Debo usar .NET 4.0's Parallel.For/ForEach?

De cualquier manera, ¿cómo puedo reunir los resultados de cada página en una sola colección? ¿O esto no es necesario?

¿Puedo leer desde mi Dictionary centralizado cada vez que un método de análisis finaliza para ver si están allí, al mismo tiempo?

Si ejecuto este programa para 4000 páginas, lleva como 90 minutos, sería genial si pudiera usar todos mis 8 núcleos para terminar la misma tarea en ~ 10 minutos.

Respuesta

1

Después de eso, verifico si están en mi Diccionario de URLs ya vistas, y si no lo están, entonces las agrego a una nueva lista y la IU muestra esta lista, que es básicamente temas nuevos/hilos creados desde la última vez. Dado que todas estas operaciones parecen independientes, ¿cuál sería la mejor manera de paralelizar esto?

Puede usar Parallel.For/ForEach para hacer eso, pero debe pensar un poco en el diseño de su rastreador. La mayoría de los rastreadores tienden a dedicar varios subprocesos para el rastreo y cada hilo se asocia con un cliente ir a buscar la página que se encarga de ir a buscar las páginas (en su caso, probablemente mediante el WebRequest/WebResponse) recomendaría la lectura de estos documentos:

Si implementa el diseño Mercator, entonces fácilmente debería ser capaz de descargar 50 páginas por segundo, por lo que 4000 páginas se descargarán en 80 segundos.

De cualquier manera, ¿cómo puedo reunir los resultados de cada página en una sola colección?

Puede almacenar sus resultados en un ConcurrentDictionary<TKey, TValue>, como mencionó Darin.No necesita almacenar nada en el valor, ya que su clave sería el enlace/URL, sin embargo, si está realizando un URL-seen Test, puede hacer un hash de cada enlace/URL en un entero y luego almacenar el hash como la clave y el enlace/URL como el valor.

¿O no es necesario?

Depende totalmente de usted decidir qué es necesario, pero si está realizando una prueba con URL visto, entonces es necesario.

¿Puedo leer desde mi diccionario centralizado cada vez que un método de análisis finaliza para ver si están allí, simultáneamente?

Sí, el ConcurrentDictionary permite que varios hilos se lean simultáneamente, por lo que debería estar bien. Funcionará bien si solo quiere ver si un enlace ya se ha rastreado.

Si ejecuto este programa para 4000 páginas, me lleva unos 90 minutos, sería genial si pudiera usar todos mis 8 núcleos para terminar la misma tarea en ~ 10 minutos.

Si diseña su oruga lo suficientemente bien, debería poder descargar y analizar (extrae todos los enlaces) de 4000 páginas en aproximadamente 57 segundos en una PC de escritorio promedio ... obtengo aproximadamente esos resultados con la estándar C# WebRequest en una PC de 4GB, i5 a 3.2 GHz con una conexión de 10 Mbps.

+0

Gracias, el diseño de Mercator puede ser un poco complejo de implementar, pero voy a recopilar todos los enlaces extraídos en un 'ConcurrentDictionary', y luego de hacerlo, juntar los nuevos enlaces al compararlos con mi colección centralizada, que también quiero para hacer un 'ConcurrentDictionary', entonces también puedo hacer este paso en paralelo. Eso es lo mejor que pude pensar. –

4

Parallel.For/ForEach combinados con un ConcurrentDictionary<TKey, TValue> para compartir estado entre diferentes hilos parecen una buena manera de implementar esto. El diccionario simultáneo garantiza la lectura/escritura segura de múltiples hilos.

+0

Gracias, quieres decir almacenar todos los enlaces de las páginas analizadas en un ConcurrentDictionary o cada vez que un método extrae sus enlaces, busca en mi colección centralizada los nuevos enlaces, donde esta colección centralizada debe ser un ConcurrentDictionary? –

Cuestiones relacionadas