• 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

Object Storage Arubacloud
+1 głos
131 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 (155,460 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 (155,460 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 482 wizyt
pytanie zadane 7 lipca 2015 w C i C++ przez niezalogowany
0 głosów
2 odpowiedzi 385 wizyt
pytanie zadane 11 kwietnia 2017 w C i C++ przez WireNess Stary wyjadacz (11,240 p.)
0 głosów
1 odpowiedź 177 wizyt
pytanie zadane 12 października 2019 w C i C++ przez amelia.cpp Obywatel (1,860 p.)

92,583 zapytań

141,434 odpowiedzi

319,669 komentarzy

61,966 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...