Estou procurando importar grandes dados de séries temporais multicanal (100Mb - 1 GB) para um banco de dados PostgreSQL. Os dados são provenientes de arquivos no formato EDF que agrupam os dados em "registros" ou "épocas", geralmente com alguns segundos cada. O registro de cada época mantém os sinais para cada canal de dados como matrizes sequenciais de números inteiros curtos.
Sou mandatado para armazenar os arquivos no banco de dados, na pior das hipóteses como BLOBs. Dado isso, gostaria de investigar opções que me permitiriam fazer algo mais com os dados no banco de dados, como facilitar consultas com base nos dados do sinal.
Meu plano inicial é armazenar os dados como uma linha por registro de época. O que estou tentando avaliar é se os dados reais do sinal são armazenados como tipos de bytea ou smallint [] (ou mesmo smallint [] []). Alguém poderia recomendar um sobre o outro? Estou interessado nos custos de armazenamento e acesso. É provável que o uso seja inserido uma vez, leia ocasionalmente, atualize nunca. Se alguém fosse mais facilmente agrupado como um tipo personalizado, de modo que eu pudesse adicionar funções para analisar a comparação de registros, tanto melhor.
Sem dúvida, tenho poucos detalhes, portanto, fique à vontade para adicionar comentários sobre o que você gostaria que eu esclarecesse.
fonte
Respostas:
Na ausência de respostas, eu também explorei a questão.
Parece que as funções definidas pelo usuário podem lidar com todos os tipos de base, incluindo
bytea
esmallint[]
, portanto, isso não afeta muito a escolha da representação.Tentei várias representações diferentes em um servidor PostgreSQL 9.4 em execução localmente em um laptop Windows 7 com uma configuração de baunilha. As relações para armazenar os dados reais do sinal foram as seguintes.
Objeto grande para o arquivo inteiro
Matriz SMALLINT por canal
BYTEA por canal em cada época
Matriz 2D SMALLINT por época
Matriz BYTEA por época
Em seguida, importei uma seleção de arquivos EDF para cada uma dessas relações via Java JDBC e comparei o crescimento no tamanho do banco de dados após cada upload.
Os arquivos foram:
Em termos de custo de armazenamento, eis o tamanho ocupado em MB para cada caso:
Em relação ao tamanho do arquivo original, os Objetos Grandes eram cerca de 30 a 35% maiores. Por outro lado, o armazenamento de cada época como BYTEA ou SMALLINT [] [] era menos de 10% maior. Armazenar cada canal como uma tupla separada gera um aumento de 40%, como BYTEA ou SMALLINT [], portanto não é muito pior do que armazenar como um objeto grande.
Uma coisa que eu não havia apreciado inicialmente é que "matrizes multidimensionais devem ter extensões correspondentes para cada dimensão" no PostgreSQL . Isso significa que a
SMALLINT[][]
representação só funciona quando todos os canais de uma época têm o mesmo número de amostras. Portanto, o arquivo C falha ao trabalhar com aEpochArray
relação.Em termos de custos de acesso, não brinquei com isso, mas pelo menos em termos de inserir os dados inicialmente, a representação mais rápida foi
EpochBytea
eBlobFile
, comEpochChannelArray
a mais lenta, demorou cerca de três vezes o tempo das duas primeiras.fonte