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ę.
Prenature optimization. Nie próbuj rozwiązać problemu którego nie masz.
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.
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?
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.
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.
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ś"]
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.