O SQLite é uma opção sensata para o registro de dados?


8

Estou tentando configurar um pequeno aplicativo de registro de dados no linux. Os dados chegam via porta serial e, a partir daí, devem ser bombeados para o registro e a exibição gráfica.

A funcionalidade de log existe para fins de inicialização da funcionalidade de gráficos, após uma reinicialização.

Os dados chegam a cada segundo e são compostos por 1 número de precisão de 5 dígitos decimais e devem ser registrados por 2 anos. Meu espaço livre atual é de cerca de 15 GB.

As linguagens do projeto até agora são bash e python.

Meus objetivos são criar um sistema de registro simples, mas robusto (talvez alguns backups em tempo real para uma unidade flash?), Que também seja rápido e fácil de ler em python e gravar em bash.

O SQLite é adequado para isso (nunca o usei)? É um arquivo de texto na minha casa diretório adequado para isso?


7
No mundo do software, não há "o melhor"; existem apenas trade-offs.
M3th0dman

@Thijs van Dien, esse comentário deve ser uma resposta - ele merece no mínimo um voto positivo por sua simplicidade, se não for a resposta aceita!
Vorac 23/08/13

Como quiser. :)
Thijs van Dien

Respostas:


6

Ambas as opções parecem válidas para mim. Nesses casos, uma regra útil a ser aplicada é fazer a coisa mais simples possível . Os arquivos de texto são mais fáceis de começar e devem funcionar razoavelmente bem, pelo menos no começo. Quando surgirem requisitos que sejam mais satisfeitos usando um banco de dados, será trivial importá-los. Usando essa estratégia, você adia as decisões de design pelo maior tempo possível (mas não mais do que isso). Como tal, você não faz um trabalho desnecessário. Quando, se alguma vez for necessário, você terá uma compreensão muito melhor do que exatamente é necessário. Portanto, é mais provável que você construa a Coisa Certa e não perca tempo construindo a Coisa Errada.


Muito bom conselho. Falando por experiência, eu acho. Tipo de bater em casa também.
TheRealChx101 23/06/19

11

Eu diria que, dados os requisitos de robustez e longevidade, um arquivo de texto antigo simples é uma escolha melhor. Como outros observaram, sua taxa de dados não é alta; Além disso, seu pós-processamento está todo offline no sistema de registro, para que você não precise gravar seus dados da maneira mais eficiente, pois poderá lê-los novamente quando quiser.

Um sistema de arquivos é um banco de dados (embora um degenerado) e os anexos aos arquivos de texto são muito leves nos recursos do sistema. Seria difícil vencer

echo data >> mylogfile

para atividade mínima de chamada do sistema. Além disso, os arquivos de texto são muito mais robustos diante de corrupção interna do que um sqlite db e, especialmente, um arquivo pickle.

Suponho que seu aplicativo seja um sensor remoto e autônomo, em algum lugar não fácil de obter para um operador. Nesse caso, a solução de menor tecnologia deve ser preferida.


A outra coisa interessante sobre o uso de um arquivo de texto simples é que, se você o dividir por dia, poderá usar a mesma técnica para compactar arquivos antigos usando um crontrabalho, economizando espaço em disco. Assim
Peter K.

Sim, arquivo de texto com uma linha por segundo. Simples, durável e expansível (se / quando adicionar mais sensores / quantidades, eles serão anexados na mesma linha). Aqui está uma discussão mais geral do meu sistema e aqui está o código fonte em funcionamento. Vou postar uma resposta com capturas de tela nessa outra resposta, quando funcional.
Vorac 23/08/13

É importante destacar que um arquivo de texto pode ser sinalizado para o modo somente acréscimo usando o chattr + para proteger efetivamente o conteúdo da substituição. Isso não pode ser feito com o sqlite.
Federico

3

Como @gbjbaanb apontou, o SQLite "não foi projetado para inserir muitos registros em alta velocidade".

Eu diria que 1 número / 1 segundo não é de alta velocidade se você mantiver a conexão com o banco de dados aberta. E isso deve funcionar razoavelmente bem, mas os logs geralmente são feitos em arquivos, essa solução é mais convencional e talvez elegante devido a isso.

Eu usava arquivos de texto e criava um novo todo mês. Você pode compactar e / ou excluir arquivos antigos depois de algum tempo, se o espaço no disco rígido for um problema.

Se "A funcionalidade de log estiver disponível para fins de inicialização da funcionalidade de gráficos, após uma reinicialização". e você só precisa de uma janela de tempo com os últimos n elementos , pode adicionar um finallybloco ao seu código e usá-lo pickleem dumpalgumas estruturas de dados e loaddepois da reinicialização. Mas certifique-se de que a reinicialização esteja realmente permitindo que você faça o que precisa.

Essa é provavelmente a solução que requer menos recursos e se encaixa melhor aos seus requisitos.


Eu considerei sua resposta muito profundamente. No entanto, cheguei à conclusão de que a criação de um novo arquivo todos os meses adiciona uma lógica significativa ao projeto. Consequentemente, eu decidi usar um arquivo hudge. No entanto, ele será arquivado uma vez por mês, para o qual dou +1.
Vorac 23/08

2

Não. O SQLite é uma ótima ferramenta, mas não foi projetado para inserir muitos registros em alta velocidade.

A melhor solução aqui é algo que pode ser anexado rapidamente, e isso é um arquivo. Esse arquivo pode ser localizado em qualquer lugar que você quiser; no Linux, eles geralmente são colocados em / var / log (como alguns administradores preferem colocar / var em uma partição separada, portanto, se um aplicativo não autorizado gravar muitos dados, ele não trava o sistema operacional ao preencher o disco).

Depois que os dados são gravados, você pode escrever uma ferramenta que lê os arquivos de log, os importa para um banco de dados SQLite e o usa para gerar relatórios.

Como alternativa, use uma ferramenta existente, como o Nagios . Escreva um plug-in para ele (se você não puder configurá-lo para reconhecer seus dados diretamente no arquivo de log) e use-o para monitorar e gerar relatórios.


Você diria que um registro por segundo é "alta velocidade"?
Thorsten Müller

não, não mesmo, mas o SQLite ainda não é a ferramenta para isso. Inserir no meio de uma tabela com 63 milhões de registros não será super rápido. Um arquivo de texto ainda é uma opção mais eficiente.
Gbjbaanb

0

Sim. SQLite é apenas um arquivo binário. Você só precisa ter um esqueleto vazio para o seu banco de dados uma vez e, em seguida, é possível anexar dados ao arquivo binário para preencher o "banco de dados".

Em uma antiga empresa, implementamos isso no sistema operacional Symbian (usando a linguagem c ++), fazendo algum tipo de registro também. Infelizmente, isso foi há um tempo atrás e não me lembro dos detalhes.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.