Gdzie trzymać słownik do gry

0

Witam. Mam zamiar stworzyć prostą gierkę (coś w stylu wordle czy słowoku z kurnika). Mam już listę słów w postaci pliku .txt ze strony sjp.pl i sam plik waży prawie 50MB. Z tego co widzę to wordle jakimś cudem trzyma wszystkie dostępne słówka na frontendzie w tablicy. Obawiam się jednak, że trzymanie takiego wielkiego pliku na frontendzie to nie jest za dobry pomysł. Potrzebowałbym mieć w sumie 2 funkcjonalności: Pierwszy to wylosuj jakieś słowo ze słownika i drugi to sprawdź czy dane słowo w nim jest. Jak więc to rozwiązać? Myślałem, żeby postawić do tego dodatkowy serwer (np. w nodzie + express) i udostępniać podane wcześniej funkcjonalności przez API ale pytanie, czy to będzie w miarę wydajne, takie przeszukiwanie pliku TXT? Też ciekawy jestem jak działa słowoku z kurnika, bo tam żadnych zapytań do API nie widzę.

3

Prenature optimization. Nie próbuj rozwiązać problemu którego nie masz.

2

50MB to nie jest jakoś specjalnie dużo dla przeglądarki/serwera. Natomiast na pewno wpłynie na czas ładowania strony
dlatego lepiej wystawić jakieś API.

2
Maciej Żelazny napisał(a):

pytanie, czy to będzie w miarę wydajne, takie przeszukiwanie pliku TXT?

Jeśli chcesz mieć to na backendzie, to dlaczego w TXT, skoro możesz to wrzucić do bazy danych?

0
lookacode1 napisał(a):

50MB to nie jest jakoś specjalnie dużo dla przeglądarki/serwera. Natomiast na pewno wpłynie na czas ładowania strony
dlatego lepiej wystawić jakieś API.

Tak, tylko to jest plik tekstowy. Zatem po spakowaniu będzie tego 10x mniej, a samo pakowanie wykona serwer HTTP i przeglądarka w locie i automatycznie. A to już nie jest aż tak sporo do popchnięcia przez sieć.
Zatem... ja bym to zassał po prostu z serwera na starcie aplikacji, a potem martwił się czy API jest potrzebne.

0
LukeJL napisał(a):
Maciej Żelazny napisał(a):

pytanie, czy to będzie w miarę wydajne, takie przeszukiwanie pliku TXT?

Jeśli chcesz mieć to na backendzie, to dlaczego w TXT, skoro możesz to wrzucić do bazy danych?

Jak chce go tylko zwrócić to co za różnica. Jak postawi server to może go trzymać in-memory i serwować na zapytanie.

wloochacz napisał(a):
lookacode1 napisał(a):

50MB to nie jest jakoś specjalnie dużo dla przeglądarki/serwera. Natomiast na pewno wpłynie na czas ładowania strony
dlatego lepiej wystawić jakieś API.

Tak, tylko to jest plik tekstowy. Zatem po spakowaniu będzie tego 10x mniej, a samo pakowanie wykona serwer HTTP i przeglądarka w locie i automatycznie. A to już nie jest aż tak sporo do popchnięcia przez sieć.
Zatem... ja bym to zassał po prostu z serwera na starcie aplikacji, a potem martwił się czy API jest potrzebne.

Możesz porobić różne sztuczki. Np Możesz podzielić ten plik 50MB, na 25 plików po 2MB, typu wordsA.txt, wordsB.txt, wordsC.txt, front losuje literkę i wczytuje tylko słowa zaczynające się na nie.

2

Jeśli autor nie chce tworzyć bazy i trzymać tego w bazie, to lepszy według mnie byłby format JSON, zamiast txt, bo JavaScript podczas importu zamieni to na prawidłowy obiekt JavaScript i odpada nam problem z parsowaniem.

{
  "zwierzęta": ["Żubr", "Bóbr", "Kura", "Łoś"],
  "miasta": ["Warszawa", "Olsztyn"]
}
import words from './words.json';

console.log(words['zwierzęta']); // ["Żubr", "Bóbr", "Kura", "Łoś"]
3
Xarviel napisał(a):

Jeśli autor nie chcę tworzyć bazy i trzymać tego w bazie, to lepszy według mnie byłby format JSON, zamiast txt, bo JavaScript podczas importu zamieni to na prawidłowy obiekt JavaScript i odpada nam problem z parsowaniem.

{
  "zwierzęta": ["Żubr", "Bóbr", "Kura", "Łoś"],
  "miasta": ["Warszawa", "Olsztyn"]
}

Ano. Tylko, że jeśli trzymać to w tablicy, to powinno być jakoś posortowane (żeby wyszukiwać to binarnie).
Albo trzymać to w obiektach

{
  "zwierzęta": {
      "Żubr": 1,
      "Bóbr": 1, 
      "Kura": 1,
      "Łoś": 1,
  }
}

i pozwolić JSowi na optymalizację. Albo drzewo prefiksowe...

A to by trzeba było zrobić z profilerem w ręku. I mieć na uwadze, że czasami naiwne i niezoptymalizowane rozwiązania też mogą być wystarczające, jeśli wydajność jest dobra.

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