• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z programem losującym słowa

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
+1 głos
349 wizyt
pytanie zadane 21 maja 2020 w C i C++ przez Marcin Siniarski Gaduła (4,420 p.)

Głównym punktem tego kodu jest zabawa z funkcjami seekg() i tellg().
Więc wyszukałem w internecie i pobrałem słownik do gier sjp.pl w formacie tekstowym.

Kod używa Boost.Program_options i bibliotekę filesystem z C++17
https://pastebin.com/keLbUtRU

Jest kilka problemów.

Na początku wszystkie pozycje słów były ładowane do listy. Niestety to skutkowało długim czasem ładowania i ~100 MB zużytej pamięci. 

Wpadłem na pomysł liczenia znaków nowej linii (\n). 1 MB zużycia pamięci uznaje za sukces, ale iteracja z 1 do 1.000.000 słowa trochę zajmuje, szczególnie w trybie Debug.

Czy jest jakiś optymalny (optymalniejszy) sposób na ten problem ?

komentarz 21 maja 2020 przez mokrowski Mędrzec (158,660 p.)
A jaki dokładnie jest powód że nie chcesz słów załadować do std::vector<std::string> ?
komentarz 21 maja 2020 przez Marcin Siniarski Gaduła (4,420 p.)

Głównym punktem tego kodu jest zabawa z funkcjami seekg() i tellg().

Niestety to skutkowało długim czasem ładowania i ~100 MB zużytej pamięci. 

2 odpowiedzi

+1 głos
odpowiedź 22 maja 2020 przez mokrowski Mędrzec (158,660 p.)
wybrane 22 maja 2020 przez Marcin Siniarski
 
Najlepsza
Zakładając że ma mieć to walor edukacyjny, to przy przyjętych założeniach pozostaje Ci:

1. Alokowanie bufora na plik ( https://en.cppreference.com/w/cpp/io/basic_filebuf/setbuf )

2. Ew. zebranie informacji o pozycjach każdego ze słów w pliku tak aby szybciej nawigować do danej pozycji.

3. Skorzystanie z wątków dostępnych w C++ w celu zrównoleglenia operacji.

4. Skorzystanie z mechanizmów systemowych właściwych dla danego systemu operacyjnego.

Co do 1 i 2, miałbym jakieś nadzieje na przyśpieszenie operacji (oczywiście diabeł tkwi w szczegółach i np. warto rozdzielić synchronizację strumieni by zaobserwować przyrost wydajności). Reszta pomysłów raczej wydaje mi się mocno na siłę. Plik z zasady ma dostęp sekwencyjny a zwykłe wrotki nie pokonają bariery dźwięku po doczepieniu silników rakietowych :)
+1 głos
odpowiedź 22 maja 2020 przez TOM_CPP Pasjonat (22,640 p.)

Tak na szybko: Zrezygnuj z funkcji ignore, która odpowiedzialna jest za długi czas wyszukiwania.

W funkcji open wczytujesz pozycje linii do std::vector

std::vector<std::size_t> line_positions; 
do 
{ 
   line_positions.push_back(f.tellg());
   std::getline(f,current_line);
} while(input_stream);

w funkcji get(...) wczytujesz używając wcześniej zapisanych pozycji

f.seekg(line_positions[x]);
std::getline(f,word);

 

Podobne pytania

+2 głosów
3 odpowiedzi 864 wizyt
pytanie zadane 7 lipca 2015 w C i C++ przez niezalogowany
0 głosów
2 odpowiedzi 791 wizyt
pytanie zadane 11 kwietnia 2017 w C i C++ przez WireNess Stary wyjadacz (11,240 p.)
0 głosów
1 odpowiedź 242 wizyt
pytanie zadane 12 października 2019 w C i C++ przez amelia.cpp Obywatel (1,860 p.)

93,430 zapytań

142,427 odpowiedzi

322,652 komentarzy

62,792 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

...