c# - HTTPWebResponse+StreamReader Muy lento
performance web-crawler (8)
¿Has probado ServicePointManager.maxConnections? Normalmente lo pongo en 200 para cosas similares a esto.
Estoy intentando implementar un rastreador web limitado en C # (solo para unos cientos de sitios) usando HttpWebResponse.GetResponse () y Streamreader.ReadToEnd (), también intenté usar StreamReader.Read () y un bucle para construir mi cadena HTML.
Solo estoy descargando páginas que son alrededor de 5-10K.
¡Todo es muy lento! Por ejemplo, el tiempo promedio de GetResponse () es aproximadamente medio segundo, mientras que el tiempo promedio de StreamREader.ReadToEnd () es de aproximadamente 5 segundos.
Todos los sitios deben ser muy rápidos, ya que están muy cerca de mi ubicación y tienen servidores rápidos. (en Explorer prácticamente no lleva nada a D / L) y no estoy usando ningún proxy.
Mi rastreador tiene alrededor de 20 hilos que leen simultáneamente desde el mismo sitio. ¿Podría esto estar causando un problema?
¿Cómo puedo reducir los tiempos de StreamReader.ReadToEnd DRASTICALLY?
¿Por qué el multihilo no soluciona este problema? El subprocesamiento múltiple minimizaría los tiempos de espera de la red, y como almacenaría el contenido del búfer en la memoria del sistema (RAM), no habría ningún cuello de botella de E / S al tratar con un sistema de archivos. Por lo tanto, las 82 páginas que demoran 82 segundos en descargarse y analizarse deben demorar unos 15 segundos (suponiendo un procesador 4x). Corrígeme si me falta algo.
____ DESCARGAR HILO _____ *
Descargar contenidos
Form Stream
Leer contenidos
_________________________ *
El programa de descargas de WebClient es un envoltorio simple para HttpWebRequest. ¿Podría intentar usarlo temporalmente y ver si la velocidad mejora? Si las cosas se ponen mucho más rápidas, ¿podría compartir su código para que podamos ver qué puede estar mal con él?
EDITAR:
Parece que HttpWebRequest observa la configuración de "conexiones simultáneas máximas" de IE, ¿están estas URL en el mismo dominio? ¿Podría intentar aumentar el límite de conexiones para ver si eso ayuda? Encontré este artículo sobre el problema:
De forma predeterminada, no puede realizar más de 2-3 async HttpWebRequest (depende del sistema operativo). Para anularlo (la forma más fácil, IMHO) no olvide agregar esto en la sección del archivo de configuración de la aplicación:
<system.net>
<connectionManagement>
<add address="*" maxconnection="65000" />
</connectionManagement>
</system.net>
Encontré que el método de configuración de la aplicación no funcionaba, pero el problema aún se debía a la configuración del proxy. Mi simple solicitud solía demorar hasta 30 segundos, ahora toma 1.
public string GetWebData()
{
string DestAddr = "http://mydestination.com";
System.Net.WebClient myWebClient = new System.Net.WebClient();
WebProxy myProxy = new WebProxy();
myProxy.IsBypassed(new Uri(DestAddr));
myWebClient.Proxy = myProxy;
return myWebClient.DownloadString(DestAddr);
}
Gracias a todos por las respuestas, me han ayudado a cavar en la dirección correcta. Me he enfrentado con el mismo problema de rendimiento, aunque la solución propuesta para cambiar el archivo de configuración de la aplicación (como entendí que la solución es para aplicaciones web) no se ajusta a mis necesidades, mi solución se muestra a continuación:
HttpWebRequest webRequest;
webRequest = (HttpWebRequest)System.Net.WebRequest.Create(fullUrl);
webRequest.Method = WebRequestMethods.Http.Post;
if (useDefaultProxy)
{
webRequest.Proxy = System.Net.WebRequest.DefaultWebProxy;
webRequest.Credentials = CredentialCache.DefaultCredentials;
}
else
{
System.Net.WebRequest.DefaultWebProxy = null;
webRequest.Proxy = System.Net.WebRequest.DefaultWebProxy;
}
HttpWebRequest puede tardar un poco en detectar la configuración de su proxy . Intenta agregar esto a la configuración de tu aplicación:
<system.net>
<defaultProxy enabled="false">
<proxy/>
<bypasslist/>
<module/>
</defaultProxy>
</system.net>
También puede ver una leve ganancia de rendimiento al almacenar en búfer sus lecturas para reducir el número de llamadas realizadas al socket del sistema operativo subyacente:
using (BufferedStream buffer = new BufferedStream(stream))
{
using (StreamReader reader = new StreamReader(buffer))
{
pageContent = reader.ReadToEnd();
}
}
Tuve el mismo problema, pero cuando senté el parámetro Proxy de HttpWebRequest en nulo, resolvió el problema.
UriBuilder ub = new UriBuilder(url);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create( ub.Uri );
request.Proxy = null;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Tuve problema el mismo problema pero el peor. response = (HttpWebResponse) webRequest.GetResponse (); en mi código se demoró unos 10 segundos antes de ejecutar más código y después de esto, la conexión saturó mi conexión.
La respuesta de kurt defaultProxy enabled = "false"
resuelve el problema. ahora la respuesta es casi instantánea y puedo descargar cualquier archivo http a la velocidad máxima de mis conexiones :) perdón por el mal inglés