jak uniknąć przepełnienia pamięci

0

Pisze programik wczytujący bardzo dużą bazę danych. Baza udostępniana jest przez publiczne API. Ze względu na swą naturę może ona być naprawdę gigantycznych rozmiarów (mimo tego, że wczytuję z filtrowaniem). Jeżeli spróbuję ją wczytywać tak z marszu ryzykuję błędem związanym z brakiem pamięci co zapewne wywali program.
Jedno rozwiązanie to paginacja rozumiana jako wczytywanie jednorazowo powiedzmy 1000 rekordów. Ale to mi niezupełnie pasuje.
Chodzi o to, że chcę mieć wczytaną jednorazowo możliwie dużą część bazy. Akceptuję sytuację, że część niewczytana jest niedostępna i tak pozostanie. Pytanie, jak poinstruować program, żeby przestał wczytywać, kiedy jest już bardzo blisko przepełnienia (umówmy się, że potrafię określić ilość pamięci dla pojedynczego rekordu czy jakąś tam ilość którą chcę mieć wolną.)?

0

Jedno rozwiązanie to paginacja rozumiana jako wczytywanie jednorazowo powiedzmy 1000 rekordów. Ale to mi niezupełnie pasuje.

Rozwiń. Tobie nie pasuje? Biznesowi? Dlaczego nie pasuje?

0

Piszę to dla nauki własnej.
Nie podobałaby mi się sytuacja kiedy użytkownik (niby ja, ale ten program gdzieś tam upublicznię) widział komunikat: 'wczytano 1000 pierwszych rekordów spełniających warunek, jeżeli chcesz zobaczyć następny tysiąc wciśnij enter'. Dane będą w tabelce która i tak będzie z paginacją. Chcę mieć naraz dostęp do możliwie dużej części bazy, akceptowalny jest komunikat " nie można wczytać całej bazy ze względu na brak pamięci" .

0

Pytanie, jak poinstruować program, żeby przestał wczytywać, kiedy jest już bardzo blisko przepełnienia
(umówmy się, że potrafię określić ilość pamięci dla pojedynczego rekordu czy jakąś tam ilość którą chcę mieć wolną.)?

W sensie, że chcesz zamulić użytkownikowi komputer albo spowodować, że będzie miał zero miejsca na dysku? Skądś ta pamięć musi się wziąć przecież.

Pisze programik wczytujący bardzo dużą bazę danych. Baza udostępniana jest przez publiczne API.

A poza tym w jaki sposób to piszesz? Czy program jest w NodeJS czy po stronie przeglądarki? Czy publiczne API znaczy, że nie masz kontroli nad backendem?

Naturalne podejście to jakby po prostu backend odpytywał bazę i zwracał odpowiednie dane.

Nie podobałaby mi się sytuacja kiedy użytkownik (niby ja, ale ten program gdzieś tam upublicznię)
widział komunikat: 'wczytano 1000 pierwszych rekordów spełniających warunek,
jeżeli chcesz zobaczyć następny tysiąc wciśnij enter'.

To może wczytuj z wyprzedzeniem? Wczytujesz 1000, pokazujesz, ale w tle już się ładuje kolejny tysiąc. Tak że zawsze jesteś o jedną stronę do przodu?

Nie wiem czy to dobre rozwiązanie, ale tak mi przyszło do głowy

Swoją drogą bez przesady, jak masz 1000 rekordów, to i tak tego nie przejrzysz od razu. Co za problem co kilkanaście minut wcisnąć enter?

1

Podejścia są różne:

  • algorytmy przetwarzania plików zamiast struktur
  • wczytywanie tylko części danych naraz i zapis cząstkowych wyników
  • podział problemu na n maszyn

Ale, patrząc na forum na którym piszesz wygląda na to że wybrałeś zły język programowania.

Jeśli masz takie zbiory że Ci przepełniają pamięć to:
a) JavaScript prawdopodobnie zwiększa zapotrzebowanie na pamięć, ponieważ nie ma struktur danych dostosowanych do problemu
b) JavaScript jest za wolnym językiem do takich zagadnień
c) JavaScript nie da się łatwo rozszerzyć o szybsze moduły - chyba że robisz w node.js

Spróbuj zrobić to samo w Pythonie, C++, Julii lub Javie.
Problem podziału danych pozostanie, ale może doczekasz się końca przetwarzania.

0

A jaki masz problem z paginacją? przecież to jest najbardziej optymalne rozwiązanie i wszyscy to stosują, zobacz np na komentarze na yt lub fb

0

Mozna zawsze zrobic tak zeby byl ten infinite scroll ale w dom renderowal tylko to co miesci sie na ekranie uzytkownika + 100 rekordow do tylu/przodu w taki przypadki w pamieci masz wszystkie rekordy jakie wczytasz za pomoca scroll-owania a zeby nie zamylic komus kompa do DOM-a pakujesz tylko te widocznie i uwierz mi ze takie data table dzialaja spokojnie z data set-ami po 100k, np ten w vue https://github.com/Akryum/vue-virtual-scroller uzywa IntersectionObserver API ktore jest wbudowane w niektore przegladarki co za tym idzie kalkuluje dosyc szybko widocznosc elementow na ekranie.
Nawet rozwiazania strict w js sa dosyc szybkie

0

@marcio niech tylko autor nie zastosuje tego do jakiś systemów zewnętrznych bo userzy zjedzą mu zasoby w bazie i transfer jednocześnie :)

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