W jaki sposób najlepiej przechowywać duże ilości danych?

0

Witam,

Ostatnio pracuję nad programem desktopowym (C++/qt), który ma za zadanie analizować dane wprowadzone przez użytkownika, wykonywać na nich operacje matematyczne oraz wyświetlać w formie wykresów.
Problem polega na tym, że wprowadzone dane muszą być przechowywane, by wyświetlać wykresy zmian poszczególnych parametrów.

**Przykład: ** Użytkownik wprowadzał co miesiąc dane o wartości jakiegoś towaru do programu, po czym po roku chce zobaczyć wykres obrazujący zmiany wartości tego towaru.

Dotychczas korzystałem z plików XML (oddzielny plik dla oddzielnego "zestawu danych"), ale nie jestem do końca pewien czy w przypadku dużej ilości danych ma to sens. Nie miałem wcześniej styczności z bazami danych, ponieważ przy pisaniu prostych aplikacji konsolowych wystarczyły mi pliki XML i txt.

Moje podstawowe pytanie brzmi, więc: W jaki sposób najlepiej przechowywać duże ilości danych?
Chciałbym również (w miarę możliwości oczywiście) zabezpieczyć ową bazę danych przed dostępem osób niepowołanych np. szyfrując dane czy coś podobnego (nie mam pojęcia zielony jestem :( ).

Mile widziane linki do podstaw i jakiekolwiek szersze porady. Za pomoc z góry dziękuję.

7

A ile to dla Ciebie dużo? Dla niektórych 640kB to już dużo, a w mojej poprzedniej pracy wszystko poniżej 1PB to było mało.

Jeżeli chcesz pozostać przy zapisie w plikach, to polecam protobuf.

0
kmle napisał(a):

A ile to dla Ciebie dużo? Dla niektórych 640kB to już dużo, a w mojej poprzedniej pracy wszystko poniżej 1PB to było mało.

Trudno mi określić rozmiar, ponieważ ilość danych będzie zależeć od tego ile użytkownik ich poda - ile pozycji wpisze do programu, jak je opisze itd.. Najbardziej zależy mi po prostu na tym, by ubrać to w jakąś formę, która maksymalnie ograniczy ewentualne pożeranie dysku oraz nie będzie zbytnio obciążać komputera (tak wiem - najpierw program, później optymalizacja, ale zawsze lepiej optymalizować niż zmieniać)

Jeżeli chcesz pozostać przy zapisie w plikach, to polecam protobuf.
Wydaje się ciekawą opcją. Na moje oko jest bardziej przejrzysty, a wszędzie opisują go jako bardziej wydajny od XML.

Wielkie dzięki za nakierowanie :)

1

Dalej nie opisałeś nawet co to będą za dane, byśmy mogli chociaż oszacować ich wielkość. Ale jak chcesz przeprowadzać na nich obliczenia, to IMHO najlepsze będzie SQLite.

0
hauleth napisał(a):

Dalej nie opisałeś nawet co to będą za dane, byśmy mogli chociaż oszacować ich wielkość. Ale jak chcesz przeprowadzać na nich obliczenia, to IMHO najlepsze będzie SQLite.

Przede wszystkim liczby, dużo liczb, ale też i opisy tj. tytuły kategorii, nazwy produktów, komentarze.

Program w założeniu ma uprościć zarządzanie firmą od strony finansowej i logistycznej, więc będą tam ilości towarów, przychody, wydatki, nazwy dostawców, godziny dostaw, ilość sprzedanych towarów itd. (dużo by wypisywać).

0

Jeżeli dane nie wymagają przechowywania powiązań między danymi, ani operowania na nich za pomocą algebry relacji, to nie ma potrzeby trzymać tego w bazie relacyjnej. W przedstawionym zastosowaniu:

Użytkownik wprowadzał co miesiąc dane o wartości jakiegoś towaru do programu, po czym po roku chce zobaczyć wykres obrazujący zmiany wartości tego towaru.

wystarczy dane trzymać w pliku. Trzymanie danych w pliku nie wyklucza, że mogą być szyfrowane.

0

@nathanfox: najpierw powinieneś określić to jak dużo danych użytkownik będzie w stanie zgromadzić, a dopiero po tym kroku należy się zastanawiać nad sposobem ich zapisu i przechowywania. W przeciwnym razie możesz wybrać złe rozwiązanie i później będziesz musiał tracić czas na poprawki i tworzenie rozwiązań, pozwalających na przeportowanie danych ze starego systemu zapisu do nowego (np. z binarek/konfigów do bazy danych).

Wiesz co użytkownik będzie gromadził, znasz typy danych, znasz też rodzaj tych danych, więc możesz określić ich rozmiar. Jeśli użytkownik raz na miesiąc doda kilka 100-bajtowych wpisów to spokojnie możesz skorzystać z prostych plików. A jeżeli raz na miesiąc może dodać kilka megabajtów (i więcej) to lepszym rozwiązaniem może być baza danych.

A jak już chcesz kompletnie na ślepo dobierać rozwiązanie to IMO mniejszym złem będzie baza danych – będzie dobrze działać i dla małej ilości danych, i dla większego zbioru. Czego w przypadku własnej implementacji i prostych plikach nie można być pewnym.

0
nathanfox napisał(a):
hauleth napisał(a):

Dalej nie opisałeś nawet co to będą za dane, byśmy mogli chociaż oszacować ich wielkość. Ale jak chcesz przeprowadzać na nich obliczenia, to IMHO najlepsze będzie SQLite.

Przede wszystkim liczby, dużo liczb, ale też i opisy tj. tytuły kategorii, nazwy produktów, komentarze.

Program w założeniu ma uprościć zarządzanie firmą od strony finansowej i logistycznej, więc będą tam ilości towarów, przychody, wydatki, nazwy dostawców, godziny dostaw, ilość sprzedanych towarów itd. (dużo by wypisywać).

Masz dwie ścieżki, albo używasz lekkiego SQLite'a i liczysz się z tym, że będziesz musiał z czasem zrobić ręcznie jakąś rotację plików, żeby z każdym selectem nie "rezać" danych które są nieistotne. Albo od razu bierzesz na warsztat cassandre i do 500GB na pojedyńczej instancji masz spokój.

0

Po tym wszystkim faktycznie najlepszym wyjściem będą bazy.

several napisał(a):

Masz dwie ścieżki, albo używasz lekkiego SQLite'a i liczysz się z tym, że będziesz musiał z czasem zrobić ręcznie jakąś rotację plików, żeby z każdym selectem nie "rezać" danych które są nieistotne. Albo od razu bierzesz na warsztat cassandre i do 500GB na pojedyńczej instancji masz spokój.

Apache Cassandra? A select to po prostu wywołanie?

Co do SQLite znacie może jakiś kurs/książkę gdzie tłumaczą to łopatologicznie? Ewentualnie to samo, ale z Cassandrą?

PS: Wybaczcie mi, ale jestem hobbistą i czasem nie wiem kompletnie o czym mówią programiści :D

1

@nathanfox: SQLite'a powinieneś mieć w pakiecie z Qt, które używasz podobno. Jeśli chodzi o Cassandre to TUTAJ masz drajwer od datastaxu (firmy która zarabia na supporcie cassandry). Zachęcałbym jednak, żebyś zaczął od SQLite.

0
several napisał(a):

@nathanfox: SQLite'a powinieneś mieć w pakiecie z Qt, które używasz podobno. Jeśli chodzi o Cassandre to TUTAJ masz drajwer od datastaxu (firmy która zarabia na supporcie cassandry). Zachęcałbym jednak, żebyś zaczął od SQLite.

Qt dopiero stopniowo ogarniam i przyznam, że po za ogarnianiem desingu nie zaglądałem tam głębiej - ważne było, że pojawiało się okno, wpisywałem dane i miałem zamierzony efekt :x Ogólnie dla mnie to nowe "środowisko", bo "bawię się" tam może z tydzień i pomalutku ogarniam poszczególne elementy mojej układanki - powoli, ale zawsze w przód : D

Właśnie też myślałem o SQLite, bo po poszukiwaniach znalazłem dość dużo poradników, przez co na pewno będzie mi łatwiej coś wydłubać.

PS: Przyznam szczerze, że o sposobie zapisu danych pomyślałem dopiero jak złożyłem pierwsze instrukcje. Nie ma to jak błędy nowicjusza :D

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