2010-04-26 12 views
5

Mam prosty kawałek danych, który przechowuję na serwerze, jako zwykły ciąg znaków. To trochę śmieszne, ale wygląda to tak:Tworzenie i analizowanie wielkich ciągów za pomocą javascript?

name|date|grade|description|name|date|grade|description|repeat for a long time 

ten ciąg może mieć rozmiar do 1,4 mb. Chodzi o to, że jest to zbiór studenckich płyt, po prostu połączonych z prostym ogranicznikiem. To bardzo słaba metoda serializacji.

Po wysłaniu tego masywnego ciągu do klienta, jest on ponownie dzielony wzdłuż rur na rekordy ucznia, używając javascript.

Sprawdzałem, ile czasu potrzeba na utworzenie i podzielenie tych łańcuchów po stronie klienta. Czasy są całkiem dobre, najwolniejszy bieg, jaki widziałem na kilku różnych komputerach, to 0,2 sekundy dla 10 000 "rekordów studentów", które mają końcowy rozmiar łańcucha ~ 1,4mb.

Rozumiem, że jest to dość dziwne, tylko zastanawiasz się, czy istnieją nieodłączne problemy z tworzeniem i dzieleniem tak dużych ciągów przy użyciu javascript? Nie wiem, w jaki sposób różne przeglądarki implementują swoje silniki javascript. Próbowałem już tego w "głównych" przeglądarkach, ale nie wiem, jak by to działało w starszych wersjach każdego z nich.

Tak, szukam komentarzy na ten temat, to więcej dla zabawy niż cokolwiek innego!

Dzięki łupania

Odpowiedz

1

String danych 1.4MB nie jest problemem dla porządnych maszyn, a nie trzeba się martwić o prędkości połączenia internetowego użytkowników. Próbowałem sprawdzić pisownię ze słownikiem 800 kb (co stanowi połowę danych), głównym problemem był czas ładowania.

Wygląda jednak na to, że dane uczniów mogą zostać zapisane w bazie danych i mogą nie wymagać ładowania wszystkiego w czasie ładowania. A więc, jak zrobić paginację, aby wyświetlić rekordy użytkownika lub użyć ajax, aby zażądać przeszukania określonych nazw użytkowników?

+0

+1 Jedyny problem, jaki widzę, to poleganie na implementacji JS opartej na przeglądarce. – lexu

1

Jeśli jest to naprawdę duży ciąg może zapłacić do ciągłego pokroić ciąg z 'string'.slice(from, to) aby przetwarzać tylko mniejszego podzbioru, dołączając wszystkie poszczególne pozycje do końca wyjściu z list.push() lub coś podobnego może działać.

Metody dzielenia łańcuchów są prawdopodobnie najskuteczniejszym sposobem robienia tego, nawet w IE. Przetwarzanie pojedynczych znaków za pomocą string.charAt(x) jest bardzo powolne i często pokazuje błąd bezpieczeństwa, ponieważ zatrzymuje działanie przeglądarki. Używanie metod dzielenia łańcucha na pewno byłoby dużo szybsze niż dzielenie przy użyciu wyrażeń regularnych.

Możliwe może być również kodowanie danych przy użyciu macierzy JSON, niektóre nowsze przeglądarki, takie jak IE8/Webkit/FF3.5, mają szybkie analizowanie JSON wbudowane przy użyciu JSON.parse(data). Ale użycie eval(JSON) może przepełnić przeglądarkę, jeśli jest wystarczająca ilość danych, więc jest to prawdopodobnie zły pomysł. Może jednak zapłacić za porównanie wydajności.

Znacznie lepszym rozwiązaniem w wielu przypadkach jest użycie AJAX i załadowanie tylko niektórych danych naraz z serwera, co również zaoszczędziłoby czas pobierania.

1

Oprócz doskonałych komentarzy S. Mark'a na temat prędkości lokalnej i szybkości transmisji oraz wskazówki do ponownego kodowania za pomocą AJAX, sugeruję (długoterminowe) odejście od JavaScriptu w przeglądarce (zakładając, że to było uruchamiane) do nie-przeglądarki implementacji JS (lub ewentualnie innego języka).

Przeglądarka JS wydaje się być linkiem tygodniowym w łańcuchu danych i nic nie chciałbym uruchomić bez nadzoru, ponieważ przeglądarki są uaktualniane od czasu do czasu, a zerwanie JS-x-fota może być nieprzewidywalne efekt uboczny!

Powiązane problemy