Necesito optimizar una aplicacion!!!

Iniciado por Skeletron, 5 Enero 2010, 02:37 AM

0 Miembros y 1 Visitante están viendo este tema.

Skeletron

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?

Skeletron


seba123neo

¿¿ vos descargas la web para analizar el codigo fuente??  :o, se puede directamente sacar los link y cualquier otra cosa que quieras de uan web sin necesidad de estar bajandola.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

raul338

Cita de: seba123neo en  5 Enero 2010, 03:21 AM
¿¿ vos descargas la web para analizar el codigo fuente??  :o, 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 :P)

seba123neo

jaja obvio, claro, cuando dije bajar la "web" me referia al html  :xD, 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.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

Skeletron

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 :D

Ahora el problema esta en como crear el metodo que controle el evento que se terminó de "bajar" el html al webclient :/

seba123neo

#6
proba algo asi:

Código (vbnet) [Seleccionar]
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...
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

Skeletron

Genal Sebas.. te lo agradezco una y mil veces..
lo del progreso no será suficiente.. total será en un segundo. muchas gracias!!!

Skeletron

#8
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?:
Código (vbnet) [Seleccionar]
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

Skeletron

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:



Código (vbnet) [Seleccionar]
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???