Pergunta

O que é a forma mais eficiente de armazenar grandes matrizes (10000x100) em um banco de dados, por exemplo, hsqldb? Eu preciso fazer isso para um determinado programa de matemática que eu estou escrevendo em java. Por favor ajude. A matriz inteira será recuperada e armazenada frequentemente (não tanto elementos individuais). Além disso, alguns meta-dados sobre as necessidades de matriz para ser armazenado sobre a matriz.

Foi útil?

Solução

Ótima pergunta.

A menos que você deseja traduzir suas matrizes em um conjunto de tabelas normalizadas, que parece que você não fizer isso, você pode querer serialização contemplar.

A serialização é uma palavra chique para transformar objetos em algum formato que você pode salvar em disco ou um banco de dados. Os dois principais formatos de serialização são binários e XML, e eu estou apostando que o Java tem algum suporte para isso.

Dependendo do que tipos de dados que você está usando, você deve ser capaz de transformar sua matriz em XML ou binário e, em seguida, a ressalva de que a um único campo no banco de dados. Você poderia começar com esta técnica em Java, verificando http: //java.sun. com / desenvolvedor / technicalArticles / Programação / serialização / . Eu sei que ele é construído em .NET.

Espero que isso ajude. Deixe-me saber se eu posso te dar mais sentido.

Outras dicas

Como sobre como armazenar os dados como um BLOB e usando Java para decodificar o BLOB em uma matriz Java real? Seria muito mais eficiente para armazenar e recuperar todo o conjunto em um gole, mas seria terrível para girando elementos individuais.

Come-se com uma representação interna -. Seja ele XML, JSON, alguns arquivo binário que você venha com si mesmo, ou qualquer outra forma de serialização

armazená-lo em uma tabela usando o tipo de dados "blob". Armazenar todos os metadados associados com a matriz em colunas adicionais.

Eu discordo fortemente que a maneira de fazer isso é criar uma tabela com o mesmo número de linhas e colunas como sua matriz -. Que é um preço muito alto a pagar por funcionalidades que você não use

Prepare a sua inserção / selecionar declarações de antemão, e uso ligam variáveis ??para mudar o que matriz você está trabalhando com -. Não faça o db reanalisar cada pedido

Se a sua é de apenas 1 array, por que não usar um arquivo binário?

Como allready sugeriu: Não use um RDBMS se você não precisa de recursos. Em vez de serialização que você pode querer concider uma API de baixo nível, como JDBM que fornece algum banco de dados como recursos como gestão um índice em disco.

Se seus dados são densamente (o histograma valores está perto de linha fixa), a sua melhor escolha é blob e serialização usando Object [entrada / saída] Stream.

Caso contrário, você pode achar que é mais eficiente usar matrizes esparsas e variação do esquema do atributo de entidade Value. Aqui está um exemplo:

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

Isso também permite que você atualizações rápidas para partes da tabela e fatias seleção usando SQL 'como' operador.

Se o número de suas dimensões é fixa para quebrar a coluna de chave de colunas int separadas para cada dimensão, a fim de melhorar a eficiência do índice e têm critérios de selecção mais flexíveis (você pode usar primeiro 'nulo' índice de metadados como o valor padrão).

Em qualquer caso, é uma boa idéia para criar um índice agrupado em Nome, colunas IndexKey.

Defina uma tabela com os dados sua matriz detém e inserir os valores da matriz em uma tabela.

Isto é muito simples de acesso a dados / armazenamento. Será que seus dimensões da matriz ser sempre o mesmo?

  • Faça-o em uma grande transação explícita. Não force o sistema de banco de dados para criar uma nova transação implícita para cada inserção.
  • Use uma declaração preparada.

PostgreSQL tem suporte embutido para arrays.

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

Java serialização para um array de bytes armazenados como BLOB vai ser sua melhor aposta. Java serializado uma grande variedade de forma bastante eficiente. Use o restante das colunas linhas para qualquer coisa que você estiver interessado em consultar em cima ou exibir prontamente. Ele também pode ser uma boa idéia para manter os BLOBs em sua própria tabela e têm as linhas "regulares" apontam para as linhas "bolha", se você consultar e relatório sobre os dados não BLOB muito (embora isto pode variar de acordo com a implementação de banco de dados ).

suportes HSQLDB 2,0 um matrizes tridimensionais armazenado como uma coluna da tabela. Assim, cada linha da tabela corresponderá a uma linha da matriz 2D.

Mas se você pretende obter uma matriz 2D como um todo, BLOB é a melhor solução.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top