cuducos / minha-receita

🏢 Sua API web para consulta de informações do CNPJ da Receita Federal

Home Page:https://minhareceita.org

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Falha de violação de memória usando o Docker 25.0.2 e Go 1.22.0

takusuman opened this issue · comments

Boa madrugada a todos, espero não estar sendo inconveniente pelo horário.

Eu estou tentando transformar o banco de dados de 19 de Outubro de 2023 e estou obtendo esse erro:

S145% docker-compose run --rm -v"$(readlink -f ../bd/)":/bd minha-receita transform -m 2 --batch-size 2048 --clean-up --directory /bd/2023-10-19/               
                                                                                                                                                                       
2024/02/13 05:00:23 Dropping table public.cnpj…                                                                                                                        
2024/02/13 05:00:23 Creating table public.cnpj…                                                                                                                        
2024/02/13 05:00:23 Saving the updated at date to the database…                                                                                                        
2024/02/13 05:00:24 Loading Simples files…                                         
2024/02/13 05:00:24 Loading Empresas files…                                        
2024/02/13 05:00:24 Loading Socios files…                                          
panic: runtime error: invalid memory address or nil pointer dereference            
[signal SIGSEGV: segmentation violation code=0x1 addr=0x10 pc=0xc727ba]                                                                                                
                                                                                                                                                                       
goroutine 77 [running]:                                                                                                                                                
github.com/cuducos/minha-receita/transform.(*source).countLinesFor(0xc00060e420, 0x0, 0x0?, 0x0?)                     
        /minha-receita/transform/source.go:90 +0x5a                                
created by github.com/cuducos/minha-receita/transform.(*source).countLines in goroutine 82                                                                             
        /minha-receita/transform/source.go:112 +0x93    

Não sei o porquê da falha estar ocorrendo, pelo o que eu pesquisei pode ir desde um limite baixo demais de memória --- o que não é o caso, o ulimit aqui no meu sistema retorna unlimited, ou seja, toda a memória está disponível sem limites, além de que isso é um problema literalmente dos anos 90 --- e também que o programa pode estar tentando de-referenciar um ponteiro nulo, o que pode acontecer em um banco de dados caso alguma informação não exista.

Coloquei os requisitos no mínimo ali e, mesmo assim, ainda estou tendo problemas em executar.
De qualquer forma, enquanto não obter resposta em decorrência do horário, tentarei buscar nos arquivos .zip se consigo a informação que necessito.

Obrigado pela atenção desde já.

Veja se a conversa da #176 ajuda. Tem alguns detalhes que pergunto lá que você esclareceu.

além de que isso é um problema literalmente dos anos 90

Acho isso uma mentira. Tenho diversos problemas de memória lidando com esses dados, veja por exemplo o parâmetro -x e outras issues aqui.

Dependendo do teu sistema operacional e configuração do Docker, teu sistema operacional nativo pode ter memória, mas o do container não.

Bom dia, perdão pela demora na resposta.

Veja se a conversa da #176 ajuda. Tem alguns detalhes que pergunto lá que você esclareceu.

Certo, irei esclarecer mais alguns detalhes:

PostgreSQL estava no Docker ou no sistema operacional nativo?

Está no Docker, subi usando docker-compose up -d postgres.

Como você criou esse banco de dados?

Usei docker-compose run --rm -v"$(readlink -f ../bd/)":/bd minha-receita create e depois docker-compose run --rm -v"$(readlink -f ../bd/)":/bd minha-receita transform -m 2 --batch-size 2048 --clean-up --directory /bd/2023-10-19/

Vc conseguiu identificar no teu HD/SSD algum local que inflou mais ou menos 100Gb ao longo do processo?

Nem deu tempo de criar um arquivo.

Acho isso uma mentira. Tenho diversos problemas de memória lidando com esses dados, veja por exemplo o parâmetro -x e outras issues aqui.

Eu comentei isso porque a última vez que eu vi alguém dizendo para usar ulimit/limit no shell para alterar a memória foi num Makefile do SunOS. 😅

Dependendo do teu sistema operacional e configuração do Docker, teu sistema operacional nativo pode ter memória, mas o do container não.

Bom saber disso agora, estou pensando em usar Docker numa aplicação como alternativa ao chroot e não tinha pensado nisso.

O erro ocorre na hora da leitura de um arquivo /minha-receita/transform/source.go:90. Esse arquivo é um CSV descompactado, em teoria.

O download está integro? Qual o resultado de minha-receita check?

O erro ocorre na hora da leitura de um arquivo /minha-receita/transform/source.go:90. Esse arquivo é um CSV descompactado, em teoria.

Show de bola, parece que eu não estava tão equivocado.

O download está integro? Qual o resultado de minha-receita check?

Vou ser franco contigo, eu nem sabia que esse comando existia.
Vou ver aqui e já aviso, mas baixei tudo do espelho que vocês mantém e parecia tudo íntegro.

Show.

image

Baixando de novo, vou verificar e então executar o comando de transform.

Bem, aconteceu uma penca de coisa aqui: baixei os arquivos, deu pico de luz, corrompeu minha partição NTFS, tive que reiniciar no Windows e rodar o chkdsk... Agora estou rodando de novo, nenhum erro até agora.

Depois de horas rodando, consegui isso:

image

Antes ele estava congelando a máquina, então criei um arquivo de troca de 15GB (tenho 12GB de RAM) e deixei trabalhando durante todo esse tempo.

Irei deixar rodando pela madrugada e ver se o erro se repete ou se foi mero acidente de agora.

Até amanhã a todos. 👋

Bem, dois dias de trabalho e tudo foi para o espaço agora com um panic: send on closed channel --- erro que ainda não pesquisei o suficiente acerca pois minha máquina permaneceu rodando apenas o programa por esse dia inteiro.

image

É o mesmo erro de #185, mas o estranho é que meu HD ainda continua com o exato mesmo espaço livre, então, aparentemente, não seria falta de espaço, mas sim algum problema com o fato de eu estar rodando o Postgres no Docker.

@cuducos Vou fechar o issue por aqui, muito obrigado por tudo e fica para a próxima --- espero alguma hora poder contribuir em algo aqui. 🙏🏽
Não vou mais precisar pegar o histórico aqui porque já conseguiram atestar o que era preciso de outra forma mas, de qualquer forma, é bom saber que o banco de dados da RF está sendo arquivado todo mês.
Eu gostaria de pedir que a "spec" do banco de dados da RF pudesse ser mais explicitado para que outras reimplementações em outras linguagens ou até mesmo otimizações possam ser feitas. Sério, isso fica mais fácil conhecendo como o arquivo é organizado (sim, eu vi a documentação sobre contribuição, mas ali não fica muito claro ainda como os arquivos são lidos e "parseados" pelo programa em Go). Não sei como está seu cronograma aí, mas seria bacana explicar como essa parte do código funciona na documentação.
Tirando isso, parabéns mesmo pelo trabalho, fico realmente esperançoso em ver que outras pessoas estão se importando com transparência de dados por parte do Estado brasileiro.

Abraço a você e ao pessoal da equipe de desenvolvimento. 🤙🏽

mas sim algum problema com o fato de eu estar rodando o Postgres no Docker

Exato. O Docker é apenas uma ferramenta de desenvolvimento, não algo que utilizo para subir o banco todo.

Eu gostaria de pedir que a "spec" do banco de dados da RF

Isso a própria RFB disponibiliza, no arquivo de layout em PDF no portal de dados abertos oficial.

não fica muito claro ainda como os arquivos são lidos e "parseados" pelo programa em Go

Isso está no guia de contribuição linkado no README.md, em Arquitetura: número do CNPJ e estrutura do pacote transform.