0

そのため、サイトからいくつかのリンクを保存する必要がありますが、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);
}

}

さて、エラーは別の場所にあります。vardocument = webGet.Load(formattedUrl);でoutofmemoryexceptionが発生しています。

4

1 に答える 1

1

Webサイトからスクレイピングされた情報をN回(たとえば1,000回)実行した後、ハードディスク(データベース、物理ファイル)の_empresasのコンテンツを永続化します。次に、_empresasをクリーンアップして新しい情報セットを取得します

あなたがしていることは、あなたのPEのためにCLRによって許可されたすべてのメモリをほとんど使用しています

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);
    }
}

}

于 2013-01-17T16:16:44.750 に答える