cuducos / minha-receita

🏢 Sua API web para consulta de informações do CNPJ da Receita Federal
https://minhareceita.org
MIT License
1.29k stars 129 forks source link

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

Closed takusuman closed 7 months ago

takusuman commented 7 months ago

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á.

cuducos commented 7 months ago

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.

takusuman commented 7 months ago

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.

takusuman commented 7 months ago

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.

cuducos commented 7 months ago

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?

takusuman commented 7 months ago

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.

takusuman commented 7 months ago

Show.

image

takusuman commented 7 months ago

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

takusuman commented 7 months ago

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.

takusuman commented 7 months ago

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. :wave:

takusuman commented 7 months ago

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. 🤙🏽

cuducos commented 7 months ago

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.