Wyszukiwanie wzorca w kodzie html

Wyszukiwanie wzorca w kodzie html
CE
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 9 lat
  • Postów:29
0

Cześć,

napisałem prosty program, który liczy występowanie słów pomiędzy jakimiś kluczowymi słowami np.
[kluczowe słowo start] liczenie wystepowanie [kluczowe słowo stop]
Jest on zrobiony na zasadzie wczytania do tablicy każdej linijki z pliku metodą getline. Problem pojawił się w wydajności. Przy 5k linijek wydajność oscyluje ~10-15s co niestety mnie nie zadowala. Jakim sposobem mógłbym zejść nawet poniżej sekundy ? Dodam, że tekst w pliku jest to zwykły kod html(źródło strony).
Oczywiście nie chcę jakiegoś gotowca tylko wskazówki.

edytowany 1x, ostatnio: Cezikos
Shalom
Powiedz mi, ale tak szczerze. Czy szukałeś odpowiedzi na swoje pytanie w google pod hasłem "szybkie wyszukiwanie"? Nie? To czemu nadałeś temu wątkowi taki głupi temat?
Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

A mozesz pokazac jak teraz to robisz? Bo trudno mi uwierzyć w tak słabą wydajność ;] Pokaż samą funkcję która szuka stringa wewnątrz drugiego stringa.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
CE
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 9 lat
  • Postów:29
0

Zlicza mi ilość wystąpień frazy, a następnie zwraca wartość.

Kopiuj
int Szukaj( string & tekst, string szukanaFraza )
{
    size_t znalezionaPozycja = tekst.find( szukanaFraza );
    long int i = 0;

    do
    {
        znalezionaPozycja = tekst.find(szukanaFraza, znalezionaPozycja + szukanaFraza.size() );
        size_t znalezionaPozycja2 = tekst.find( szukanaFraza );
        if ( znalezionaPozycja2 != string::npos)
            i++;
    } while( znalezionaPozycja != string::npos );
    return i;
}

Oczywiście powyższa funkcja jest jeszcze poprzedzoną funkcją, która przypisuje odpowiednią kolejno linijkę z pliku do tablicy i zwraca string.

Kopiuj
string Odczyt(int a)
{
    string wiersz;
    ifstream plik;
    plik.open ( "plik.txt" );

    string tablica[ilosc_wierszy()];
    int i = 0;
        while ( !plik.eof() || i <= a )
        {
            getline( plik, wiersz);
            tablica[i] = wiersz;
            i++;
        }
    plik.close();
    return tablica[a-1];
}

Mam przeczucie, że pierwszy kod działa najwolniej bo mam funkcję, która sprawdza mi ilość linijek w pliku i wykonuje swoje zadanie poniżej sekundy.
Dałoby się jakoś pominąć tablicę ? Bo chyba cały problem polega na sprawdzeniu x tablic co może być powolnym procesem...
(Oczywiście zastosowałem trick bo wiem, że w moim pliku szukana wartość jest pod koniec dlatego zaczynam od końca, gdybym miał wyszukiwać frazy od początku skrypt wykonywałby mi się 60sek.)

PS: Dopiero uczę się programować...

Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0
  1. A czemu nie wczytasz całego pliku od razu? Bo trochę nie ogarniam jaką to niby zrobi ci różnicę, oprócz tego ze będzie szybciej...
  2. Poza tym nie ogarniam zupełnie czemu za kazdym razem odpalasz dwa razy find, w tym jeden raz zawsze od początku stringa.

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:13 dni
1

Jak można tak sobie życie utrudniać ?!

Kopiuj
ifstream file("plik.txt");
string content;
getline(file,content,0);
size_t p=content.find("slowo kluczowe start");
size_t e=content.find("slowo kluczowe stop");
size_t count=0;
while((p=content.find("szukana fraza",p+1))<e) ++count;
cout<<"znaleziono "<<count<<" razy"<<endl;

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
CE
Tak na przyszłość jakby ktoś chciał skorzystać z tego kodu to zamiast 0 w getline należy wpisać '\0'.
_13th_Dragon
Nic z tego co @Cezikos napisał wyżej nie trzeba robić !! Tak na przyszłość, jakby ktoś chciał dodawać głupie komentarze ...
CE
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 9 lat
  • Postów:29
0
  1. Problem w tym, że nie znam funkcji, która zrobi to elegancko, jedynie przychodzi mi do głowy metoda getline + dodawanie kolejnych stringow do jednego stringa. (Jak można to poproszę o wskazówkę)
  • Jaki jest domyślny limit znaków w string ?
  • Można jakoś elastycznie zwiększać wielkość (W locie)?

-Pierwszy find usunięty, spełniał wcześniej po prostu troszeczkę inną funkcję (kontrolną) i zapomniałem później skasować.
-W pętli użyłem 2x find bo w ten sposób najprościej przyszło mi do głowy jak uwarunkować zliczanie wystąpienia + zakończenie aplikacji. Pewnie da się to lepiej wykonać, ale nie wpadłem na lepszy pomysł(zaniechałem to bo działa to co aktualnie jest).

EDIT:
Rozumiem, że w przypadku powyżej metoda getline ściąga cały tekst z pliku przez dodanie wartości 0 ? (Tak jakby unlimited ?)

edytowany 2x, ostatnio: Cezikos
Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

http://www.cplusplus.com/reference/string/string/getline/ tak trudno doczytać? Ostatni parametr to delimiter którego getline szuka w pliku. Jak mu dasz coś czego w pliku nie będzie (np. \0 którego w tekstowym pliku nie ma) to wczyta wszystko.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
CE
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 9 lat
  • Postów:29
0

Co jeżeli w pliku tekstowym występują wszystkie znaki z zakresu ASCII ?

Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

To jest to plik binarny a nie tekstowy, ale nadal można go łyknąć w całości jakimś fread:
http://www.cplusplus.com/reference/cstdio/fread/


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
CE
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 9 lat
  • Postów:29
0

Chyba zrobie sobie pętle, która bedzie dodawac do stringa dopóki !file.eof(), ale to już jutro: )

Shalom
Eee co? Zapewniam cię ze w pliku html znaku \0 nie będzie. Zresztą chciałeś chyba zeby to działało szybko? Jak zrobisz czytanie po linii to szybko nie będzie...
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:13 dni
0
Cezikos napisał(a):

Co jeżeli w pliku tekstowym występują wszystkie znaki z zakresu ASCII ?
Gdyby babcia miała wąsy to byłaby dziadkiem.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.