2008-10-17 13 views
11

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

+0

Czy potrzebujesz dostępu losowego do elementów tablicy, czy tylko do tablic? – gnud

+0

Czy znasz rozwiązanie PostgreSQL? – luksmir

Odpowiedz

15

Ś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.

0

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?

+0

Nie, wymiary nie pozostaną takie same. –

+0

Jeśli wymiary nie są takie same, będziesz musiał użyć czegoś w rodzaju serializacji, jak podano poniżej. – Nick

+0

Zrobiłbym to również, jeśli wymiary nie są takie same. Nie ma sensu tworzyć i usuwać tabel przez cały czas. –

0
  • 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.
8

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.

+0

BLOB to sposób na przejście – MarlonRibunal

0

PostgreSQL ma wbudowaną obsługę tablic.

http://www.postgresql.org/docs/8.0/interactive/arrays.html

+1

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

+0

Czy istnieje odpowiednik typu ARRAY PSQ w MySQL i MicrosoftSQL? – luksmir

2

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.

1

Jeśli jest to tylko jedna tablica, dlaczego nie użyć pliku binarnego?

1

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.

1

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.

0

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)).

0

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.

Powiązane problemy