java webcrawler - czy da sie szybciej?

0

Siema, napisalem sobie webcrawlera, ktory po podaniu adresu strony wypisuje do pliku wszystkie linki znajdujace sie na stronie, a nastepnie wszystkie linki, z tych linkow, ktore sa w pliku. Mam nadzieje, ze to jasne. Problem polega na tym, ze ze strony glownej linki wypisuje jakies 3 sekundy(jest ich okolo 300), natomiast z tych 300 linkow przy ostatniej probie wypisywal 12 minut (bylo ich 10 000). Da sie to jakos szybciej zrobic? Jak zaczne wchodzic glebiej, to zycia mi braknie.

public class LinkExtract {
    public LinkExtract() throws Exception {
        System.out.print("Podaj adres strony: ");
        buff = new BufferedReader(new InputStreamReader(System.in));
        urlString = buff.readLine();

        readLinksFromPage();
        readLinksFromFile("links.xml");
        writePageToFile();
        countWords();
    }

    public static void main(String[] args) throws Exception {
        LinkExtract linkExtractor = new LinkExtract();
    }

    private void readLinksFromPage() throws Exception {
        out = new BufferedWriter(new FileWriter("links.xml"));
        linkBean = new LinkBean();
        linkBean.setURL(urlString);
        links = linkBean.getLinks();
        for(URL link : links) {
            if(!result.contains(link.toString())){
                result.add(link.toString());
                out.write(link.toString() + '\n');
                countLinks++;
            }
        }
        out.close();
        System.out.println(countLinks);
    }

    private void readLinksFromFile(String filename) throws Exception {
        BufferedWriter out1 = new BufferedWriter(new FileWriter("links1.xml"));
        fstream = new FileInputStream(filename);
        in = new DataInputStream(fstream);
        br = new BufferedReader(new InputStreamReader(in));
        linkBean = new LinkBean(); 

        while ((strLine = br.readLine()) != null) {
            linkBean.setURL(strLine);
            links = linkBean.getLinks();
            for(URL link : links) {
                if(!result.contains(link.toString())){
                    result.add(link.toString());
                    out1.write(link.toString() + '\n');
                    countLinks++;
                }
            }

        }
        out1.close();
        in.close();
        System.out.println(countLinks);
    }

    private void writePageToFile() throws Exception {
        url = new URL(urlString);
        out = new BufferedWriter(new FileWriter("content.xml"));
        buffReader = new BufferedReader(new InputStreamReader(url.openStream()));
        while ((inputLine = buffReader.readLine()) != null) {
            out.write(inputLine + '\n'); 
        }
        out.close();
    }

    private void countWords() throws Exception {
        System.out.print("Podaj szukany tekst: ");
        klaw = new BufferedReader(new InputStreamReader(System.in));
        searchString = klaw.readLine();
        fstream = new FileInputStream("content.xml");
        in = new DataInputStream(fstream);

        charArray = searchString.toCharArray();
        while ((n = in.read()) != -1) {
            c = (char)n;
            if (c == charArray[place]) {  
                place++;  
                if (place == charArray.length) {  
                  place = 0; 
                  countWords++;
                }  
            }  
            else place = 0;  
        }
        System.out.println(countWords);
        in.close();
        file = new File("content.xml");
        file.delete();
    }

    //parsing html file
    Collection< String> result = new ArrayList< String>();
    BufferedReader buff;
    BufferedWriter out;
    URL[] links;
    LinkBean linkBean;
    String urlString;
    int countLinks = 0;

    //read file
    FileInputStream fstream;
    DataInputStream in;
    BufferedReader br;
    String strLine;

    //write page to file
    URL url;
    BufferedReader buffReader;
    String inputLine;

    //count words
    BufferedReader klaw;
    char[] charArray;
    int place = 0; 
    int n = 0;
    char c;
    int countWords = 0;
    String searchString;
    File file;
}
0

Proponuje użyć debuggera i zobaczyć co tak dlugo trwa...

0

Pytanie jak głęboko chcesz wchodzić ? Ile tych poziomów ?
Przy założeniu że każda strona ma 100 linków, z których każdy trzeba wczytać i przeanalizować
to trzeba przeanalizować tych tron:
2 poziomy - 1002 = 10.000
3 poziomy - 1003 = 1.000.000
4 poziomy - 1004 = 100.000.000
5 poziomy - 1005 = 10.000.000.000

Nawet jak - hipotetycznie - skrócisz czas analizy jednej strony tysiąckrotnie - z 3 sekund do 3 milisekund,
to przy 5 poziomie zamiast 347222 dni zajmie ci to 347 dni.

0

w sumie o tym nie pomyslalem, a masz racje. na szczescie wykladowca odpisal na mojego maila i juz wiem, ze moge okreslic maksymalna ilosc sprawdzanych podstron, wiec problem sie rozwiaze.

Dzieki wam:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0