AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 102456
Accepted
beldaz
beldaz
Asked: 2015-05-26 21:49:55 +0800 CST2015-05-26 21:49:55 +0800 CST 2015-05-26 21:49:55 +0800 CST

PostgreSQL bytea vs smallint[]

  • 772

Estou procurando importar dados de série temporal multicanal grandes (100 MB - 1 GB) para um banco de dados PostgreSQL. Os dados vêm de arquivos no formato EDF que dividem os dados em "registros" ou "épocas" de alguns segundos cada. O registro de cada época contém os sinais para cada canal de dados como matrizes sequenciais de inteiros curtos.

Sou obrigado a armazenar os arquivos no banco de dados, no pior dos casos, como BLOBs. Diante disso, gostaria de investigar opções que me permitissem fazer algo mais com os dados do 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 devo armazenar os dados do sinal real como tipos 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, lido ocasionalmente, nunca atualizado. Se um fosse mais facilmente agrupado como um tipo personalizado, de modo que eu pudesse adicionar funções para analisar ou comparar registros, tanto melhor.

Sem dúvida, estou com poucos detalhes, então sinta-se à vontade para adicionar comentários sobre o que você gostaria que eu esclarecesse.

postgresql datatypes
  • 1 1 respostas
  • 1112 Views

1 respostas

  • Voted
  1. Best Answer
    beldaz
    2015-06-25T21:27:27+08:002015-06-25T21:27:27+08:00

    Na ausência de qualquer resposta, eu mesmo explorei mais a questão.

    Parece que as funções definidas pelo usuário podem lidar com todos os tipos básicos, incluindo bytea e smallint[], portanto, isso não afeta muito a escolha da representação.

    Experimentei várias representações diferentes em um servidor PostgreSQL 9.4 executado localmente em um laptop com Windows 7 com uma configuração padrão. As relações para armazenar esses dados de sinal reais foram as seguintes.

    Objeto grande para arquivo inteiro

    CREATE TABLE BlobFile (
        eeg_id INTEGER PRIMARY KEY,
        eeg_oid OID NOT NULL
    );
    

    Array SMALLINT por canal

    CREATE TABLE EpochChannelArray (
        eeg_id INT NOT NULL,
        epoch INT NOT NULL,
        channel INT,
        signal SMALLINT[] NOT NULL,
        PRIMARY KEY (eeg_id, epoch, channel)
    );
    

    BYTEA por canal em cada época

    CREATE TABLE EpochChannelBytea (
        eeg_id INT NOT NULL,
        epoch INT NOT NULL,
        channel INT,
        signal BYTEA NOT NULL,
        PRIMARY KEY (eeg_id, epoch, channel)
    );
    

    Matriz SMALLINT 2D por época

    CREATE TABLE EpochArray (
        eeg_id INT NOT NULL,
        epoch INT NOT NULL,
        signals SMALLINT[][] NOT NULL,
        PRIMARY KEY (eeg_id, epoch)
    );
    

    Matriz BYTEA por época

    CREATE TABLE EpochBytea (
        eeg_id INT NOT NULL,
        epoch INT NOT NULL,
        signals BYTEA NOT NULL,
        PRIMARY KEY (eeg_id, epoch)
    );
    

    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:

    • Arquivo A: 2706 épocas de 16 canais, cada canal 1024 amostras (16385 amostras por época), 85 MB
    • Arquivo B: 11897 épocas de 18 canais, cada canal 1024 amostras (18432 amostras por época), 418 MB
    • Arquivo C: 11.746 épocas de 20 canais, cada canal de 64 a 1.024 amostras (17.088 amostras por época), 382 MB

    Em termos de custo de armazenamento, eis o tamanho ocupado em MB para cada caso: Custo de armazenamento em MB

    Em relação ao tamanho do arquivo original, os Objetos Grandes eram cerca de 30 a 35% maiores. Por outro lado, armazenar cada época como BYTEA ou SMALLINT[][] foi menos de 10% maior. Armazenar cada canal como uma tupla separada dá um aumento de 40%, como BYTEA ou SMALLINT[], portanto, não é muito pior do que armazenar como um objeto grande.

    Uma coisa que inicialmente não apreciei é que "arrays 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 não funciona com a EpochArrayrelaçã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 EpochByteae BlobFile, com EpochChannelArraya mais lenta, demorando cerca de 3 vezes mais que as duas primeiras.

    • 11

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve