Question

Quel est le moyen le plus efficace de stocker des tableaux de grande taille (10000x100) dans une base de données, par exemple, hsqldb? Je dois le faire pour un programme de mathématiques que j'écris en Java. S'il vous plaît aider. L'ensemble du tableau sera récupéré et stocké souvent (pas tellement d'éléments individuels). De plus, certaines métadonnées sur le tableau doivent être stockées sur le tableau.

Était-ce utile?

La solution

Excellente question.

Sauf si vous souhaitez traduire vos tableaux en un ensemble de tables normalisées, ce qui semble être votre cas, vous pouvez envisager la sérialisation.

La sérialisation est un mot de fantaisie pour convertir les objets en un format que vous pouvez enregistrer sur le disque ou dans une base de données. Les deux principaux formats de sérialisation sont binaire et XML, et je parie que Java le supporte.

Selon les types de données que vous utilisez, vous devriez pouvoir convertir votre tableau en XML ou en binaire, puis l’enregistrer dans un seul champ de la base de données. Vous pouvez utiliser cette technique en Java en consultant http: //java.sun. com / developer / technicalArticles / Programming / serialization / . Je sais que cela est intégré à .NET.

J'espère que cela vous aidera. Faites-moi savoir si je peux vous donner plus de directives.

Autres conseils

Pourquoi ne pas stocker les données sous forme de BLOB et utiliser Java pour décoder le BLOB dans un tableau Java réel? Ce serait beaucoup plus efficace de stocker et de récupérer l’ensemble du tableau en un seul coup, mais ce serait terrible de tourner des éléments individuels.

Créez une représentation interne - XML, JSON, un fichier binaire que vous créez vous-même ou toute autre forme de sérialisation.

Stockez-le dans un tableau à l'aide du "blob". Type de données. Stockez les métadonnées associées à la matrice dans des colonnes supplémentaires.

Je ne suis absolument pas d'accord avec l'idée que la solution consiste à créer un tableau avec le même nombre de lignes et de colonnes que votre matrice - c'est un prix très élevé à payer pour une fonctionnalité que vous n'utilisez pas.

Préparez au préalable vos instructions insert / select et utilisez des variables de liaison pour modifier la matrice sur laquelle vous travaillez - ne faites pas que la base de données répare chaque requête.

S'il ne s'agit que d'un tableau, pourquoi ne pas utiliser un fichier binaire?

Comme déjà suggéré: n'utilisez pas de SGBDR si vous n'avez pas besoin des fonctionnalités. Au lieu de la sérialisation, vous pouvez envisager une API de bas niveau telle que JDBM qui fournit des fonctionnalités de base de données telles que la gestion un index sur le disque.

Si vos données sont compressées (l'histogramme de valeurs est proche de la ligne plate), votre meilleur choix est le blob et la sérialisation à l'aide du flux Object [Output / Input].

Sinon, vous pouvez trouver plus efficace d’utiliser des tableaux fragmentés et une variante du schéma Entity-Attribute-Value. Voici un exemple:

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

Ceci vous permet également de mettre à jour rapidement certaines parties de la table et de sélectionner des tranches à l’aide de l’opérateur 'like' SQL.

Si le nombre de vos dimensions est fixé pour décomposer la colonne clé, séparez les colonnes int de chaque dimension afin d'améliorer l'efficacité de l'index et de disposer de critères de sélection plus souples (vous pouvez utiliser le premier index 'null' pour les métadonnées, comme valeur par défaut).

Dans tous les cas, il est judicieux de créer un index clusterisé sur les colonnes Name et IndexKey.

Définissez une table avec les données de votre tableau et insérez les valeurs du tableau dans une table.

C'est un accès / stockage de données très simple. Les dimensions de votre tableau seront-elles toujours les mêmes?

  • Faites-le en une seule transaction explicite. Ne forcez pas le système de base de données à créer une nouvelle transaction implicite pour chaque insertion.
  • Utilisez une instruction préparée.

PostgreSQL prend en charge les tableaux.

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

La sérialisation Java sur un tableau d'octets stocké sous la forme d'un BLOB sera votre meilleur choix. Java va sérialiser un grand tableau assez efficacement. Utilisez le reste des colonnes de lignes pour tout ce que vous souhaitez interroger ou afficher facilement. Il peut également être judicieux de conserver les objets BLOB dans leur propre table et d’avoir le code "normal". les lignes pointent vers le " BLOB " lignes, si vous interrogez et générez beaucoup de rapports sur les données non BLOB (bien que cela puisse varier en fonction de la mise en œuvre de la base de données).

HSQLDB 2.0 prend en charge les tableaux à une dimension stockés dans une colonne de la table. Ainsi, chaque ligne du tableau correspondra à une ligne du tableau 2D.

Mais si vous souhaitez récupérer un tableau 2D dans son ensemble, BLOB est la meilleure solution.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top