Jaki jest najbardziej efektywny sposób przechowywania dużych tablic (10000x100) w bazie danych, np. Hsqldb? Muszę to zrobić dla pewnego programu matematycznego, który piszę w Javie. Proszę pomóż. Cała tablica będzie często pobierana i zapisywana (nie tyle pojedynczych elementów). Ponadto niektóre dane meta dotyczące tablicy muszą być przechowywane w tablicy.Przechowywanie tablic w bazach danych
Odpowiedz
Świetne pytanie.
Jeśli nie chcesz tłumaczyć tablic na zestaw znormalizowanych tabel, co brzmi jak nie, możesz rozważyć serializację.
Serializacja to wymyślne słowo, które przekształca obiekty w pewien format, który można zapisać na dysku lub w bazie danych. Dwa główne formaty do serializacji to binarne i XML i założę się, że Java ma na to wsparcie.
W zależności od typów danych, których używasz, powinieneś być w stanie przekształcić tablicę w XML lub binarny, a następnie zapisać ją w jednym polu w bazie danych. Możesz rozpocząć korzystanie z tej techniki w Javie, sprawdzając numer http://java.sun.com/developer/technicalArticles/Programming/serialization/. Wiem, że jest wbudowany w .NET.
Mam nadzieję, że to pomoże. Daj mi znać, jeśli mogę dać ci więcej wskazówek.
Zdefiniuj tabelę z danymi przechowywanymi w tablicy i wstaw wartości tablic do tabeli.
To bardzo prosty dostęp/przechowywanie danych. Czy Twoje wymiary tablicy będą zawsze takie same?
Nie, wymiary nie pozostaną takie same. –
Jeśli wymiary nie są takie same, będziesz musiał użyć czegoś w rodzaju serializacji, jak podano poniżej. – Nick
Zrobiłbym to również, jeśli wymiary nie są takie same. Nie ma sensu tworzyć i usuwać tabel przez cały czas. –
- Zrób to w jednej dużej jawnej transakcji. Nie wymuszaj na systemie baz danych tworzenia nowej niejawnej transakcji dla każdej wstawki.
- Użyj przygotowanego wyciągu.
Co powiesz na przechowywanie danych jako obiektu BLOB i używanie języka Java do dekodowania obiektu BLOB do rzeczywistej macierzy Java? Byłoby o wiele bardziej wydajne przechowywanie i odzyskiwanie całej tablicy jednym haustem, ale byłoby straszne dla twidowania poszczególnych elementów.
BLOB to sposób na przejście – MarlonRibunal
PostgreSQL ma wbudowaną obsługę tablic.
To jest bardzo dobry punkt (chociaż OP określił kilka innych db, które mogą nie mieć niesamowitej elastyczności PostgreSQL w tym zakresie). Czy wiesz, jak skutecznie jest to realizowane? Odniosłem wrażenie, że nie jest to przeznaczone dla dużych tablic, ale mogę się mylić. – SquareCog
Czy istnieje odpowiednik typu ARRAY PSQ w MySQL i MicrosoftSQL? – luksmir
wymyślić reprezentacji wewnętrznej - czy to XML, JSON, jakiś plik binarny wymyślić sam, lub jakąkolwiek inną formę serializacji.
Zapisz go w tabeli, używając typu danych "blob". Przechowuj wszelkie metadane powiązane z macierzą w dodatkowych kolumnach.
Zdecydowanie nie zgadzam się, że sposobem na to jest utworzenie tabeli z taką samą liczbą rzędów i kolumn co macierz - to bardzo wysoka cena za funkcjonalność, z której nie korzystasz.
Przygotuj wcześniej instrukcje wstawiania/wybierania i użyj zmiennych bind, aby zmienić, z której matrycy korzystasz - nie każ im dbać o każde żądanie.
Jeśli jest to tylko jedna tablica, dlaczego nie użyć pliku binarnego?
Jak już zasugerowano: Nie używaj RDBMS, jeśli nie potrzebujesz tych funkcji.Zamiast Serializacji warto rozważyć interfejs API niskiego poziomu, taki jak JDBM, który udostępnia niektóre bazy danych, takie jak funkcje zarządzania indeksem na dysku.
Jeśli twoje dane są gęsto upakowane (histogram wartości jest zbliżony do płaskiej linii), najlepszym wyborem jest blob i serializacja przy użyciu strumienia Obiekt [Wyjście/Wejście].
W przeciwnym razie może się okazać, że bardziej wydajne będzie stosowanie rzadkich tablic i odmian schematu Wartość-atrybut-Wartość. Oto przykład:
Name | IndexKey | Value
------+-----------+-------
foo | 'default' | 39
foo | 0:0:0 | 23
foo | 0:0:1 | 34
foo | 1:5:0 | 12
...
bar | 1:3:8 | 20
bar | 1:3:8 | 23
bar | 1:1:1 | 24
bar | 3:0:6 | 54
...
Umożliwia to również szybką aktualizację części tabeli i wybranie plasterków za pomocą operatora "podobnego do SQL".
Jeśli liczba Twoich wymiarów została ustalona, aby podzielić kolumnę kluczową, aby oddzielić kolumny wewnętrzne dla każdego wymiaru, aby poprawić wydajność indeksów i mieć bardziej elastyczne kryteria wyboru (możesz użyć pierwszego indeksu 'null' dla takich metadanych jak domyślna wartość).
W każdym razie dobrze jest utworzyć indeks klastrowy w kolumnach Nazwa, IndexKey.
Serializacja Java na tablicę bajtów zapisaną jako BLOB będzie najlepszym wyborem. Java znacznie wydajniej serializuje dużą tablicę. Skorzystaj z pozostałych wierszy kolumn, aby cokolwiek interesować się wyszukiwaniem lub wyświetlaniem. Dobrym pomysłem może być utrzymanie obiektów BLOB we własnej tabeli, a wiersze "regularne" powinny wskazywać wiersze "BLOB", jeśli kwerendy i raporty na danych innych niż obiekt BLOB (choć może się to różnić w zależności od implementacji bazy danych)).
HSQLDB 2.0 obsługuje jednowymiarowe tablice przechowywane jako kolumna tabeli. Zatem każdy wiersz tabeli będzie odpowiadał jednemu wierszowi tablicy 2D.
Ale jeśli chcesz odzyskać tablicę 2D jako całość, BLOB jest najlepszym rozwiązaniem.
- 1. Przechowywanie długich ciągów (CLOB) w bazach danych Hsqldb?
- 2. Wielowartościowe atrybuty w bazach danych
- 3. Przechowywanie i pobieranie tablic JavaScript do iz atrybutów danych HTML5
- 4. Przechowywanie tablic wielowymiarowych w pandach Kolumny DataFrame
- 5. Przechowywanie długich tablic statycznych w Angular
- 6. Tworzenie widoku w różnych bazach danych
- 7. Typ zdefiniowany przez użytkownika w bazach danych
- 8. Widok Sqlite w wielu bazach danych
- 9. Wybieranie kolumn w różnych bazach danych
- 10. Aktualizacja procedury przechowywanej w wielu bazach danych
- 11. co to jest liczność w bazach danych?
- 12. Przechowywanie danych w pamięci
- 13. Przechowywanie danych w pamięci
- 14. Przechowywanie danych w FirefoxOS
- 15. Obsługa przechowywania danych w bazach danych obiektów takich jak db4o
- 16. Przechowywanie ogromnych danych w SQLite
- 17. Mysql - znajdź tabelę we wszystkich bazach danych
- 18. Przechowywanie danych do NSUserDefaults
- 19. Python Przechowywanie danych
- 20. Złomowanie: przechowywanie danych
- 21. Zalecenia z danymi hierarchicznymi na nierelacyjnych bazach danych?
- 22. Query w wielu bazach danych na tym samym serwerze
- 23. Korzystanie z struktury encji w wielu bazach danych
- 24. Jakie schematy czasowe istnieją w bazach danych neo4j lub graph?
- 25. Używanie scentralizowanego modułu VBA w wielu bazach danych dostępu
- 26. Jak tworzyć procedury w różnych bazach danych za pomocą Cursor
- 27. Czy mogę tworzyć klucze obce w bazach danych?
- 28. Szczegóły wpływu różnych schematów blokowania w bazach danych?
- 29. Jak zmniejszyć dziennik transakcji w bazach danych MS SQL 2000?
- 30. Najlepszy sposób na zarządzanie zmianami w bazach danych
Czy potrzebujesz dostępu losowego do elementów tablicy, czy tylko do tablic? – gnud
Czy znasz rozwiązanie PostgreSQL? – luksmir