C# WebCrawler中的OutOfMemoryException

C# WebCrawler中的OutOfMemoryException,c#,exception,out-of-memory,C#,Exception,Out Of Memory,因此,我需要保存一个站点的多个链接,但当它接近64k链接时,会出现错误OutOfMemoryException 这是我的密码,如果有人能帮我,那就太好了 注意:如果您想要测试(当然您必须编辑才能测试,但编辑的内容不多),那么它接收的url是: http://santacatarina.entrei.net/busca/listar_empresas.php?filter={0}&pagina={1} 守则: namespace WebCrawler.SantaCatarina { c

因此,我需要保存一个站点的多个链接,但当它接近64k链接时,会出现错误
OutOfMemoryException

这是我的密码,如果有人能帮我,那就太好了

注意:如果您想要测试(当然您必须编辑才能测试,但编辑的内容不多),那么它接收的url是:

http://santacatarina.entrei.net/busca/listar_empresas.php?filter={0}&pagina={1}
守则:

namespace WebCrawler.SantaCatarina
{

class SCLinkFinder : ILinkFinder

{

private readonly Queue<char> _alfabeto;
private int _paginaAtual;
private char _letraAtual;

public SCLinkFinder()
{
    _alfabeto = new Queue<char>();
    _alfabeto.Enqueue('1');
    _alfabeto.Enqueue('A');
    _alfabeto.Enqueue('B');
    _alfabeto.Enqueue('C');
    _alfabeto.Enqueue('D');
    _alfabeto.Enqueue('E');
    _alfabeto.Enqueue('F');
    _alfabeto.Enqueue('G');
    _alfabeto.Enqueue('H');
    _alfabeto.Enqueue('I');
    _alfabeto.Enqueue('J');
    _alfabeto.Enqueue('K');
    _alfabeto.Enqueue('L');
    _alfabeto.Enqueue('M');
    _alfabeto.Enqueue('N');
    _alfabeto.Enqueue('O');
    _alfabeto.Enqueue('P');
    _alfabeto.Enqueue('Q');
    _alfabeto.Enqueue('R');
    _alfabeto.Enqueue('S');
    _alfabeto.Enqueue('T');
    _alfabeto.Enqueue('U');
    _alfabeto.Enqueue('V');
    _alfabeto.Enqueue('W');
    _alfabeto.Enqueue('X');
    _alfabeto.Enqueue('Y');
    _alfabeto.Enqueue('Z');

    _paginaAtual = 1;
    _letraAtual = _alfabeto.Dequeue();
}

public string[] Find(string url)
{
    List<string> _empresas = new List<string>();

    if (!_alfabeto.Any() && _letraAtual == ' ')
    {
        return _empresas.ToArray();
    }
    var webGet = new HtmlWeb();
    var formattedUrl = String.Format(url, _letraAtual, _paginaAtual++);
    var document = webGet.Load(formattedUrl);
    var nodes = document.DocumentNode.SelectNodes("//div[@id='conteudo']/div[@class='gratuito']/p/a");

    foreach (var node in nodes)
    {
        var href = node.GetAttributeValue("href", "");
        _empresas.Add(href);
    }

    var elUrlProximaPagina = document.DocumentNode.SelectSingleNode("//div[@id='principal']/div[@id='conteudo']/div[@class='paginacao']/a[contains(@class,'nextPage')]");
    if (elUrlProximaPagina == null)
    {
        _letraAtual = _alfabeto.Any() ? _alfabeto.Dequeue() : ' ';
        _paginaAtual = 1;
    }
    Console.WriteLine(_letraAtual);
    Console.WriteLine(_paginaAtual);

    DadoPo.SalvarUrl();         

    return Find(url);
}
namespace WebCrawler.SantaCatarina
{
类SCLinkFinder:ILinkFinder
{
专用只读队列_alfabeto;
私人国际公寓;
私有字符;
公共检索器()
{
_alfabeto=新队列();
_alfabeto.Enqueue('1');
_alfabeto.Enqueue('A');
_alfabeto.Enqueue('B');
_alfabeto.Enqueue('C');
_阿尔法贝托排队('D');
_alfabeto.Enqueue('E');
_alfabeto.Enqueue('F');
_alfabeto.Enqueue('G');
_alfabeto.Enqueue('H');
_alfabeto.Enqueue('I');
_alfabeto.Enqueue('J');
_alfabeto.Enqueue('K');
_alfabeto.Enqueue('L');
_alfabeto.Enqueue('M');
_alfabeto.Enqueue('N');
_alfabeto.Enqueue('O');
_alfabeto.Enqueue('P');
_alfabeto.Enqueue('Q');
_alfabeto.Enqueue('R');
_alfabeto.Enqueue('S');
_alfabeto.Enqueue('T');
_阿尔法贝托排队(U);
_alfabeto.Enqueue('V');
_阿尔法贝托排队(W);
_alfabeto.Enqueue('X');
_alfabeto.Enqueue('Y');
_alfabeto.Enqueue('Z');
_paginaAtual=1;
_letraAtual=_alfabeto.Dequeue();
}
公共字符串[]查找(字符串url)
{
列表_empresas=新列表();
如果(!\u alfabeto.Any()&&&u letraAtual='')
{
return _empresas.ToArray();
}
var webGet=new HtmlWeb();
var formattedUrl=String.Format(url,_letraAtual,_paginaAtual++);
var document=webGet.Load(formattedUrl);
var nodes=document.DocumentNode.SelectNodes(“//div[@id='conteudo']]/div[@class='uperto']/p/a”);
foreach(节点中的var节点)
{
var href=node.GetAttributeValue(“href”,”);
_empresas.Add(href);
}
var elUrlProximaPagina=document.DocumentNode.SelectSingleNode(//div[@id='principal']/div[@id='conteudo']/div[@class='paginacao']]/a[contains(@class='nextPage'));
if(elUrlProximaPagina==null)
{
_letraAtual=_alfabeto.Any()?_alfabeto.Dequeue():“”;
_paginaAtual=1;
}
控制台写入线(_letraAtual);
控制台写入线(_paginaAtual);
DadoPo.SalvarUrl();
返回查找(url);
}
}

好的,现在错误在另一个地方,它在发出outofmemoryexception
var document=webGet.Load(formattedUrl);

在N次(例如1000次)从网站上刮取信息后,将_empresas的内容保存在硬盘(数据库、物理文件)中。然后清除_empresas以获取新的信息集

你所做的几乎是使用CLR为你的PE所允许的所有内存

namespace WebCrawler.SantaCatarina
{
class SCLinkFinder : ILinkFinder
{
    private readonly Queue<char> _alfabeto;

    private int _paginaAtual;
    private char _letraAtual;

    public SCLinkFinder()
    {
        _alfabeto = new Queue<char>();
        _alfabeto.Enqueue('1');
        _alfabeto.Enqueue('A');
        _alfabeto.Enqueue('B');
        _alfabeto.Enqueue('C');
        _alfabeto.Enqueue('D');
        _alfabeto.Enqueue('E');
        _alfabeto.Enqueue('F');
        _alfabeto.Enqueue('G');
        _alfabeto.Enqueue('H');
        _alfabeto.Enqueue('I');
        _alfabeto.Enqueue('J');
        _alfabeto.Enqueue('K');
        _alfabeto.Enqueue('L');
        _alfabeto.Enqueue('M');
        _alfabeto.Enqueue('N');
        _alfabeto.Enqueue('O');
        _alfabeto.Enqueue('P');
        _alfabeto.Enqueue('Q');
        _alfabeto.Enqueue('R');
        _alfabeto.Enqueue('S');
        _alfabeto.Enqueue('T');
        _alfabeto.Enqueue('U');
        _alfabeto.Enqueue('V');
        _alfabeto.Enqueue('W');
        _alfabeto.Enqueue('X');
        _alfabeto.Enqueue('Y');
        _alfabeto.Enqueue('Z');

        _paginaAtual = 1;
        _letraAtual = _alfabeto.Dequeue();
    }

    public string[] Find(string url)
    {
        List<string> _empresas = new List<string>();

        if (!_alfabeto.Any() && _letraAtual == ' ')
        {
            return _empresas.ToArray();
        }
        var webGet = new HtmlWeb();
        var formattedUrl = String.Format(url, _letraAtual, _paginaAtual++);
        var document = webGet.Load(formattedUrl);
        var nodes = document.DocumentNode.SelectNodes("//div[@id='conteudo']/div[@class='gratuito']/p/a");

        foreach (var node in nodes)
        {
            var href = node.GetAttributeValue("href", "");
            _empresas.Add(href);
        }

        var elUrlProximaPagina = document.DocumentNode.SelectSingleNode("//div[@id='principal']/div[@id='conteudo']/div[@class='paginacao']/a[contains(@class,'nextPage')]");
        if (elUrlProximaPagina == null)
        {
            _letraAtual = _alfabeto.Any() ? _alfabeto.Dequeue() : ' ';
            _paginaAtual = 1;
        }
        Console.WriteLine(_letraAtual);
        Console.WriteLine(_paginaAtual);

        //Your code to read _empresas and Persist in database(or file)            

        return Find(url);
    }
}
namespace WebCrawler.SantaCatarina
{
类SCLinkFinder:ILinkFinder
{
专用只读队列_alfabeto;
私人国际公寓;
私有字符;
公共检索器()
{
_alfabeto=新队列();
_alfabeto.Enqueue('1');
_alfabeto.Enqueue('A');
_alfabeto.Enqueue('B');
_alfabeto.Enqueue('C');
_阿尔法贝托排队('D');
_alfabeto.Enqueue('E');
_alfabeto.Enqueue('F');
_alfabeto.Enqueue('G');
_alfabeto.Enqueue('H');
_alfabeto.Enqueue('I');
_alfabeto.Enqueue('J');
_alfabeto.Enqueue('K');
_alfabeto.Enqueue('L');
_alfabeto.Enqueue('M');
_alfabeto.Enqueue('N');
_alfabeto.Enqueue('O');
_alfabeto.Enqueue('P');
_alfabeto.Enqueue('Q');
_alfabeto.Enqueue('R');
_alfabeto.Enqueue('S');
_alfabeto.Enqueue('T');
_阿尔法贝托排队(U);
_alfabeto.Enqueue('V');
_阿尔法贝托排队(W);
_alfabeto.Enqueue('X');
_alfabeto.Enqueue('Y');
_alfabeto.Enqueue('Z');
_paginaAtual=1;
_letraAtual=_alfabeto.Dequeue();
}
公共字符串[]查找(字符串url)
{
列表_empresas=新列表();
如果(!\u alfabeto.Any()&&&u letraAtual='')
{
return _empresas.ToArray();
}
var webGet=new HtmlWeb();
var formattedUrl=String.Format(url,_letraAtual,_paginaAtual++);
var document=webGet.Load(formattedUrl);
var nodes=document.DocumentNode.SelectNodes(“//div[@id='conteudo']]/div[@class='uperto']/p/a”);
foreach(节点中的var节点)
{
var href=node.GetAttributeValue(“href”,”);
_empresas.Add(href);
}
var elUrlProximaPagina=document.DocumentNode.SelectSingleNode(//div[@id='principal']/div[@id='conteudo']/div[@class='paginacao']]/a[contains(@class='nextPage'));
if(elUrlProximaPagina==null)
{
_letraAtual=_alfabeto.Any()?_alfabeto.Dequeue():“”;
_paginaAtual=1;
}
控制台写入线(_letraAtual);
控制台写入线(_paginaAtual);
//您的代码可以读取并保存在数据库(或文件)中
返回查找(url);
}
}

}

你能解释得更清楚一点吗?也许可以举个例子。|也许只是这样做:if(_empresas==30000){for(int i=0;i<_empresas;i++){Database.Link=_empresas}{u empresas.empty;}?或者我误解了?请看上面的更改,我只是更改了方法中要实例化的_empresas,最后,在返回之前,将其保存到数据库中或附加到txt/xml文件中。您应该停止获取内存不足异常,但最重要的是,理解为什么会获取异常,通过上面的方法,您可以允许垃圾Collector为您清理内存谢谢!但是我不应该清空_empresas吗?否则它不会生效?您不必这样做,因为每次调用递归方法时都会创建一个新的_empresas实例