Autor
|
Tema: Necesito optimizar una aplicacion!!! (Leído 7,285 veces)
|
Skeletron
Desconectado
Mensajes: 1.731
A long way to go
|
Hola gente.. Les comento que estoy (aun no lo hice) por hacer una aplicacion que tendría que funcionar como BOT INDEXADOR de una web.
La cuestion es que, con vb.net, tengo que descargar el codigo fuente de una web, analizar las etiquetas <img ...> y tomar el link de la imagen.
La cuestion, es que necesito que el programa sea lo mas rapido posible.. y como sabran, el problema principal en velocidad, estará en la velocidad de descarga del archivo... Tengo una conexión de 1MB solamente, y si descargo un archivo con la aplicacion, estoy toltamente seguro que no utilizaré el 100% del ancho de banda.. entonces se me dió la idea de que tal vez podria mejorar eso, si tengo en todo momento descargando archivos...
Mi idea era crear unos cuantos hilos, supongamos 10.
La idea, es que con un webclient, descargo archivos de manera asincronica, y cuando se termine de descargar el codigo fuente (creo que hay un evento para ello), ejecuto un hilo que lo analiza, y al terminar de analizarlo, o sea, al final del hilo, hago que esa mismo webclient, comience con la descarga del proximo archivo, y repetir ésto..
O sea.. a ver si me explico: Al darle al boton COMENZAR, se comenzaran a descargar en 10 webclients las webs, y al terminar una, se ejecuta un hilo (thread) y analiza ese codigo, y al terminar de realizar ese analisis, coloca de nuevo a descargar otro archivo al webclient que llamó a éste hilo..
Preguntas: Ustedes creen que de esa manera ocuparé mejor el tiempo de descarga? Alguien tiene alguna idea mejor? Alguien conoce algun metodo rapido, o alguna funcion de .net para analizar etiquetas html en un codigo fuente?
|
|
|
En línea
|
|
|
|
Skeletron
Desconectado
Mensajes: 1.731
A long way to go
|
|
|
|
En línea
|
|
|
|
seba123neo
|
¿¿ vos descargas la web para analizar el codigo fuente?? , se puede directamente sacar los link y cualquier otra cosa que quieras de uan web sin necesidad de estar bajandola.
|
|
|
En línea
|
|
|
|
raul338
Desconectado
Mensajes: 2.633
La sonrisa es la mejor forma de afrontar las cosas
|
¿¿ vos descargas la web para analizar el codigo fuente?? , se puede directamente sacar los link y cualquier otra cosa que quieras de uan web sin necesidad de estar bajandola. como? que yo sepa, bajando el html solo xD Nunca utilizé el WebClient, siempre use el WebRequest y WebResponse, obtienes el HTML en string puro, y de ahi analizas (obtienes las etiquetas "A" si el documento es un xml valido, cosa que muy poco pasa, sino...tratamiento de strings ... o ...Expresiones regulares, mis favoritas )
|
|
|
En línea
|
|
|
|
seba123neo
|
jaja obvio, claro, cuando dije bajar la "web" me referia al html , pero lo que no entendi es si ¿estas bajando el html al disco duro como un archivo y despues lo abris y lo recorres para sacar los links?, porque obvio se puede hacerlo "onfly" digamos sin bajar nada al disco.
|
|
|
En línea
|
|
|
|
Skeletron
Desconectado
Mensajes: 1.731
A long way to go
|
Yo no dije bajar al disco.. Cualquier recurso que pase de internet a una PC, e una BAJADA... se baja a la ram.. O sea.. a una variable.. Dim w1 As New WebClient Dim U As New Uri(" http://www.brodasoft.com.ar/Standart/index.html")w1.DownloadStringAsync(U) Como creo un metodo con el handles del "downloadstringcomplete"???? Y en cuanto a lo de expresiones regulares, será algo así lo que tu dices: http://www.elguille.info/regexp/regExp01.aspx ... creo que eso me sará basta para poder encontrar las imagenes dentro de los codigos html Ahora el problema esta en como crear el metodo que controle el evento que se terminó de "bajar" el html al webclient :/
|
|
|
En línea
|
|
|
|
seba123neo
|
proba algo asi: Imports System.Net Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim vCliente As New WebClient AddHandler vCliente.DownloadStringCompleted, AddressOf DescargaCompleta Dim vPagina As New Uri("http://www.brodasoft.com.ar/Standart/index.html") vCliente.DownloadStringAsync(vPagina) End Sub Public Shared Sub DescargaCompleta(ByVal sender As Object, ByVal e As DownloadStringCompletedEventArgs) If e.Cancelled = False AndAlso e.Error Is Nothing Then Dim vCodigoFuente As String = CStr(e.Result) MessageBox.Show("Descarga Completa") MessageBox.Show(vCodigoFuente) End If End Sub End Class
PD: tambien podes poner un AddHandler a DownloadProgressChangedy ver el progreso de descarga...
|
|
« Última modificación: 5 Enero 2010, 04:41 am por seba123neo »
|
En línea
|
|
|
|
Skeletron
Desconectado
Mensajes: 1.731
A long way to go
|
Genal Sebas.. te lo agradezco una y mil veces.. lo del progreso no será suficiente.. total será en un segundo. muchas gracias!!!
|
|
|
En línea
|
|
|
|
Skeletron
Desconectado
Mensajes: 1.731
A long way to go
|
EDITO: Ahora que lo pienso bien.. no voy a tener que Sincronizar nada.. si no usaré hilos de ésta manera... :/ EDITO NUEVAMENTE: Ahora se me armó un quilombo.. uso o no uso?? voy a hacer unas pruebas... (ésto que viene aqui debajo, lo habia escrito antes) Che.. y continuando con el tema de optimizacion... Yo voy a tener 10 "Dim x as webclient" Los 10 van a ejecutar el mismo metodo de analisis(al terminar la descarga)... tendria que sincronizar el metodo?? Hay algun identificador para sincronizar un metodo entero? (en java se puede) Siempre me jodió el tema éste de la sincronizacion de un fragmento de codigo (o sea, no un metodo entero), porque no entiendo porque tengo que poner un objeto en la sentencia SyncLock.. o sea.. si yo tengo varias cosas por sincronizar (todo lo que esté dentro de la lineas de codigo), no tengo porque darle un "synclock" a un solo objeto... que se yo.. no entiendo eso.. En este caso tendría que ser así o no?: Imports System.Net Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim vCliente As New WebClient AddHandler vCliente.DownloadStringCompleted, AddressOf DescargaCompleta Dim vPagina As New Uri("http://www.brodasoft.com.ar/Standart/index.html") vCliente.DownloadStringAsync(vPagina) End Sub Public Shared Sub DescargaCompleta(ByVal sender As Object, ByVal e As DownloadStringCompletedEventArgs) Synclock e If e.Cancelled = False AndAlso e.Error Is Nothing Then Dim vCodigoFuente As String = CStr(e.Result) MessageBox.Show("Descarga Completa") MessageBox.Show(vCodigoFuente) End If End Synclock End Sub End Class
|
|
« Última modificación: 5 Enero 2010, 05:55 am por Skeletron »
|
En línea
|
|
|
|
Skeletron
Desconectado
Mensajes: 1.731
A long way to go
|
Creo otro post aqui debajo, por si Sebas y demas gente ya pasaron, y no verán el post en "no leidos desde la ultima visita" Una cagada... todo mal.. tengo que Sincronizar el metodo... y si o si el metodo entero.. porque.. miren.. ise la siguiente prueba: Imports System.Threading Imports System.Net Public Class Picdex Dim _w1 As New WebClient Dim _w2 As New WebClient Private Sub Picdex_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load AddHandler _w1.DownloadStringCompleted, AddressOf Trabajar AddHandler _w2.DownloadStringCompleted, AddressOf Trabajar End Sub Private Sub Comenzar(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click _w1.DownloadStringAsync(New Uri("http://www.brodasoft.com.ar/Standart/index.html")) _w2.DownloadStringAsync(New Uri("http://www.brodasoft.com.ar/Standart/index.html")) End Sub Private Sub Trabajar(ByVal sender As Object, ByVal e As DownloadStringCompletedEventArgs) SyncLock e MsgBox("Inicio") For pepe As Integer = 1 To 300 Thread.Sleep(1) Next MsgBox("Fin") End SyncLock End Sub End Class
Si ejecuto eso, como veran hay un msgbox dentro del Synclock.. pero aparecen los 2 mensajes de "INICIO" seguidos... o sea.. yo tengo que hacer algo para que primero se ejecute todo el metodo, y al terminar el metodo, vuelva a ejecutarse con el 2º webclient que produjo el evento... Definitivamente tengo que usar hilos???
|
|
|
En línea
|
|
|
|
|
|