Executando verificação de segurança...
1

O NOVO método de armazenamento do BANCO DE DADOS noSQL CookieDB.

A um tempo atrás, escrevi um artigo sobre o CookieDB aqui no TabNews, onde eu falei sobre o funcionamento e uso do banco de dados noSQL desenvolvido por mim. Hoje, falarei em detalhes sobre uma grande atualização do CookieDB disponível em sua última versão (9.0.0).

O método antigo de armazenamento

O CookieDB utilizava a biblioteca pickle para serializar os dados que são inseridos no banco, depois de serializar, esses dados eram criptografados e escritos um um arquivo .cookiedb. Esse método de armazenamento deixa a desejar em alguns aspectos, como:

  1. Execução de código arbitrário por meio da serialização de objetos usando a biblioteca pickle
  2. Para obter, adicionar, atualizar ou deletar algum item, todo o banco de dados precisa ser carregado
  3. Ao carregar todos os dados, a criptografia seria mais demorada, pois dados não solicitados estariam sendo descriptografados

Além da falha de segurança, o problema de carregamento desnecessário de dados poderia consumir muita memória RAM ao abrir um banco de dados que contém muitos dados, porque a biblioteca pickle precisa de todos os dados de serialização para que os objetos sejam desserializados.

Resolvendo o consumo excessivo de memória

Após a identificação do problema de consumo excessivo de memória, percebi que uma solução simples poderia ser implementada no CookieDB e solucionar todos os problemas citados na lista anterior. A melhor forma que encontrei para resolver isso foi desenvolver meu próprio método de armazenamento para o banco de dados.

O problema principal é carregar todos os dados enquanto apenas um é solicitado, logo, precisamos organizar os dados em um formato onde podemos percorrer um de cada vez. Aqui vai um exemplo:

ChaveValor
projects/cookiedb/nameCookieDB
projects/cookiedb/stars5248
projects/cookiedb/forks48
projects/cookiedb/pr24

Logo, para obter um dado, basta percorrer cada linha do banco de dados até encontrar o valor solicitado. No banco de dados de exemplo acima, se quisermos obter o valor do caminho projects/cookiedb/name, basta ler apenas a primeira linha e retornar o valor ao usuário, em vez de carregar todos eles.

Um teste realizado com 816.000 mil items nos traz um comparativo entre a nova versão a versão antiga do CookieDB:

Versão do CookieDBMemória consumida (em MB)
9.0.0 (nova versão)15
8.1.0 (versão antiga)326

Como vemos na tabela acima, há uma melhoria extremamente significativa no consumo de memória ao manipular bancos de dados CookieDB. Ao executar este teste, também percebi que o número de memória consumida usando a versão 9.0.0 não muda, independente da quantidade de itens utilizados no teste, ou seja, sempre se mantém entre 14 a 15 megabytes, provando o bom funcionamento do novo método de armazenamento.

Estrutura do armazenamento

Para empacotar e desempacotar os dados armazenados no banco, utilizei a biblioteca struct do Python. A estrutura de empacotamento dos dados é a seguinte:

<tamanho do caminho> <caminho> <tamanho do valor> <tipo> <valor>

Nessa estrutura, é necessário salvar também o tamanho do caminho e do valor, pois são strings dinâmicas, onde não existe um tamanho fixo.

O banco de dados encontra o item a ser manipulado decodificando apenas o caminho, após isso, realiza um comparação para checar se o caminho do item é igual ao caminho solicitado. Se os caminhos forem iguais, o CookieDB obtém o tipo do valor e realiza o desempacotamento do valor de acordo com o tipo.

Conclusão

Muitas outras atualizações virão, seja na melhoria de consumo de memória ou na velocidade de execução em manipulações no banco de dados. Você pode contribuir ao desenvolvimento do CookieDB enviando Pull Requests no GitHub, relatando problemas ou simplesmente deixando sua estrela, lembre-se que sempre será bem-vindo!