• 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

HackNation - ogólnopolski hackathon
+1 głos
414 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,940 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,940 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 1,009 wizyt
pytanie zadane 7 lipca 2015 w C i C++ przez niezalogowany
0 głosów
2 odpowiedzi 979 wizyt
pytanie zadane 11 kwietnia 2017 w C i C++ przez WireNess Stary wyjadacz (11,240 p.)
0 głosów
1 odpowiedź 322 wizyt
pytanie zadane 12 października 2019 w C i C++ przez amelia.cpp Obywatel (1,860 p.)

93,626 zapytań

142,551 odpowiedzi

323,044 komentarzy

63,130 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 1452p. - dia-Chann
  2. 1437p. - DziarnowskiJ
  3. 1411p. - Łukasz Piwowar
  4. 1409p. - CC PL
  5. 1388p. - Maurycy W
  6. 1371p. - raydeal
  7. 1369p. - Adrian Wieprzkowicz
  8. 1360p. - Tomasz Bielak
  9. 1335p. - robwarsz
  10. 1184p. - Michal Drewniak
  11. 1141p. - ssynowiec
  12. 1116p. - rucin93
  13. 1102p. - Dominik Łempicki (kapitan)
  14. 1100p. - Mariusz Fornal
  15. 1048p. - Rafał Trójniak
Szczegóły i pełne wyniki

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

Kursy INF.02 i INF.03
...