Closed adricaceres closed 1 year ago
Adria, é lack de memória mesmo. Precisaria ajustar o código ou mudar a infra
Obrigado pelo retorno Aphonso. Estou com um i7 com 8gb, por enquanto não consigo mudar a infra. Sobre ajustar o código, o que você sugere?
Entao, isso e um pouco complexo porque depende de cada infraestrutura mesmo. Por exemplo, esse codigo eu construi no meu laptop que tambem eh um i7 com 8gb, mas pra mim funcionou... De qualquer forma, na tabela do SIMPLES eu tambem tive lack de memoria e entao eu fiz um ajuste no codigo para particionar o arquivo de 1 milhao em 1 milhao de registros. Veja isso nas linhas entre 365 a 420
do arquivo ETL_coletar_dados_e_gravar_BD.py
. O ideal seria implementar esse particionamento para as demais tabelas tambem, coisa que eu nao fiz, rs. Isso que seria o ajuste de codigo.
Se vc conseguir fazer e mandar um PR, seria muito util, basicamente pode copiar essa estrutura e adaptar para a tabela estabelecimentos.
Excelente Aphonso, vou fazer esses ajustes nas demais tabelas e estando tudo ok eu mando um PR. Vou te informando qualquer novidade. Muito obrigado pela atenção.
Olá, tudo bem? Alguem conseguiu fazer isso e enviar o PR?
`
print('Lendo o arquivo ' + arquivos_estabelecimento[e]+' [...]')
extracted_file_path = Path(f'{extracted_files}/{arquivos_estabelecimento[e]}')
estabelecimento_lenght = sum(1 for line in open(extracted_file_path, "r"))
print('Linhas no arquivo do Simples '+ arquivos_estabelecimento[e] +': '+str(estabelecimento_lenght))
tamanho_das_partes = 1000000 # Registros por carga
partes = round(estabelecimento_lenght / tamanho_das_partes)
nrows = tamanho_das_partes
skiprows = 0
print('Este arquivo será dividido em ' + str(partes) + ' partes para inserção no banco de dados')
for i in range(0, partes):
print('Iniciando a parte ' + str(i+1) + ' [...]')
`
Não sei progamação... "copiei o codigo do simples e acrescentei no estabelecimento que tive o mesmo erro. Fiz conforme está acima. Aparentemente está dando certo. Se for bem sucedido avisarei aqui.
Não deu certo.... Tudo rodou lindo, so falta o estabelecimento
Erro apresentado:
Trabalhando no arquivo: K3241.K03200Y0.D20514.ESTABELE [...]
Lendo o arquivo K3241.K03200Y0.D20514.ESTABELE [...]
Linhas no arquivo do Simples K3241.K03200Y0.D20514.ESTABELE: 9789023
Este arquivo será dividido em 10 partes para inserção no banco de dados
Iniciando a parte 1 [...]
Iniciando a parte 2 [...]
Iniciando a parte 3 [...]
Iniciando a parte 4 [...]
Iniciando a parte 5 [...]
Iniciando a parte 6 [...]
Iniciando a parte 7 [...]
Iniciando a parte 8 [...]
Iniciando a parte 9 [...]
Iniciando a parte 10 [...]
Arquivo K3241.K03200Y0.D20514.ESTABELE inserido com sucesso no banco de dados! - Parte 10
Trabalhando no arquivo: K3241.K03200Y1.D20514.ESTABELE [...]
Lendo o arquivo K3241.K03200Y1.D20514.ESTABELE [...]
Traceback (most recent call last):
File "C:\Hunter_CNPJ\code\ETL_coletar_dados_e_gravar_BD.py", line 130, in
Vou aguardar a solução...
Boa tarde! Consegui resolver conforme o modelo abaixo:
`
estabelecimento_insert_start = time.time() print(""" ###############################
############################### """)
cur.execute('DROP TABLE IF EXISTS "estabelecimento";') conn.commit()
for e in range(0, len(arquivos_estabelecimento)): print('Trabalhando no arquivo: '+arquivos_estabelecimento[e]+' [...]') try: del estabelecimento except: pass
# Verificar tamanho do arquivo:
print('Lendo o arquivo ' + arquivos_estabelecimento[e]+' [...]')
extracted_file_path = Path(f'{extracted_files}/{arquivos_estabelecimento[e]}')
estabelecimento_tamanho = sum(1 for line in open(extracted_file_path, "r", encoding="mbcs"))
print('Linhas no arquivo do Estabelecimento ' + arquivos_estabelecimento[e] +': '+str(estabelecimento_tamanho))
tamanho_das_partes = 1000000 # Registros por carga
partes = round(estabelecimento_tamanho / tamanho_das_partes)
nrows = tamanho_das_partes
skiprows = 0
print('Este arquivo será dividido em ' +str(partes) + ' partes para inserção no banco de dados')
for i in range(0, partes):
print('Iniciando a parte ' + str(i+1) + ' [...]')
estabelecimento = pd.DataFrame(columns=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28])
estabelecimento_dtypes = {1: 'object', 2: 'object', 3: 'object', 4: 'object', 5: 'object', 6: 'object', 7: 'object', 8: 'object', 9: 'object', 10: 'object', 11: 'object', 12: 'object', 13: 'object', 14: 'object', 15: 'object', 16: 'object', 17: 'object', 18: 'object', 19: 'object', 20: 'object', 21: 'object', 22: 'object', 23: 'object', 24: 'object', 25: 'object', 26: 'object', 27: 'object', 28: 'object'}
extracted_file_path = Path(f'{extracted_files}/{arquivos_estabelecimento[e]}')
estabelecimento = pd.read_csv(filepath_or_buffer=extracted_file_path, encoding = "ISO-8859-1",
sep=';',
nrows=nrows,
skiprows=skiprows,
header=None,
dtype=estabelecimento_dtypes)
# Tratamento do arquivo antes de inserir na base:
estabelecimento = estabelecimento.reset_index()
del estabelecimento['index']
# Renomear colunas
estabelecimento.columns = ['cnpj_basico',
'cnpj_ordem',
'cnpj_dv',
'identificador_matriz_filial',
'nome_fantasia',
'situacao_cadastral',
'data_situacao_cadastral',
'motivo_situacao_cadastral',
'nome_cidade_exterior',
'pais',
'data_inicio_atividade',
'cnae_fiscal_principal',
'cnae_fiscal_secundaria',
'tipo_logradouro',
'logradouro',
'numero',
'complemento',
'bairro',
'cep',
'uf',
'municipio',
'ddd_1',
'telefone_1',
'ddd_2',
'telefone_2',
'ddd_fax',
'fax',
'correio_eletronico',
'situacao_especial',
'data_situacao_especial']
# Gravar dados no banco:
# estabelecimento
estabelecimento.to_sql(name='estabelecimento', con=engine, if_exists='append', index=False)
print('Arquivo ' + arquivos_estabelecimento[e] + ' inserido com sucesso no banco de dados! - Parte '+ str(i+1))
try:
del estabelecimento
except:
pass
try: del estabelecimento except: pass
print('Arquivos de estabelecimento finalizados!') estabelecimento_insert_end = time.time() estabelecimento_Tempo_insert = round((estabelecimento_insert_end - estabelecimento_insert_start)) print('Tempo de execução do processo de estabelecimento (em segundos): ' + str(estabelecimento_Tempo_insert)) `
Solução encontrado em: https://stackoverflow.com/questions/53954988/python-unicodedecodeerror-charmap-codec-cant-decode-byte-0x9d-in-position
Pessoal, está ocorrendo esse erro quando executo o python. Na tabela de empresas foi tudo ok mas quando inicia a tabela de estabelecimentos, depois de umas 15hrs executando ele da esse erro na imagem. Alguém saberia o que pode estar ocorrendo? Aparentemente é memória, apenas gostaria de confirmar. Obrigado