Gostaria da opnião e talvez até mesmo a ajuda de alguém…
Problema1 : preciso desenvolver uma aplicação Web que faça upload de arquivos txt grandes para base de dados.
Problema2 : o arquivo é delimitado por largura fixa, e eu só sei usar delimitadores.
Hoje eu tenho uma aplicação que sobe, lê e faz os inserts na tabela, porém o arquivo é delimitado por ";" e segundo que os arquivos tem no máximo 18mb....
Se o arquivo tem tamanho fixo, vc irá ler blocos de dados…
Tipo, leia cada linha do arquivo e guarde numa String. Depois vc vai dando substring. Vc sabe exatamente onde começa e onde termina cada campo.
Giulliano
Luciene…eu dei uma olhada nesse tópico faz umas duas semanas…
Até fiz o teste aumentando a maquina virtual…mas minha empresa possui 17.000 usuários…ou seja não posso contar que toda vez q alguém precisar subir um arquivo ele saiba dar o tunning na máquina…
vou tentar ler linha por linha e fazer o substring…
espero q essa API consiga melhorar o desempenho da app…
valews
E
Edson_Watanabe
Normalmente quando os arquivos são grandes é interessante a aplicação web criar um arquivo temporário, até para poder efetuar o “restart” caso necessário. Não guarde 300 MB em memória - você pode ter isso tudo no seu tocador de MP3, mas normalmente não tem tudo isso disponível no seu servidor, só para você. (Você pode ajustar algumas configurações de memória no Java, mas isso só adia o problema.)
F
fre_d
Porque você não usa bcp ou algum utilitario do banco ? Fazer inserts gera log no banco e fica mais lento.
E
Edson_Watanabe
Ou seja, sua aplicação tem de fazer as seguintes coisas:
Obter o arquivo que foi subido (upload) e gravar um arquivo temporário;
Pegar esse arquivo temporário e transformá-lo em outro, que seja apropriado para o utilitário do banco que é adequado para “bulk insert” (por exemplo, bcp, no caso do MS SQL Server, ou o SQL*Loader, no caso do Oracle), como foi sugerido pelo fre_d.
300 MB é muita coisa e leva um bom tempo para processar, mesmo com “bulk load” ou “bulk insert”.
Em uma aplicação Web eu mostraria uma página com uma mensagem do tipo “O seu arquivo foi recebido pelo servidor. O processamento está sendo feito; consulte esta página para ver o estado do processamento”* e teria uma outra página que permitisse verificar se o utilitário acabou ou não de processar o serviço.
Não com essas palavras técnicas todas; é que estou falando em jargão para VOCÊ entender melhor.
Giulliano
Então cara vc poderia ser mais específico na utilização de bcp…nunca ouvi falar…
Esses arquivos txt são os dados q precisamos carregar para o pessoal do telemarketing poder trabalhar…então cada supervisor de cada depto (são muitos) podem subir arquivos com valores para o banco…
e realmente ler 300mb em memória no java é inviável
E
Edson_Watanabe
Qual é o banco de dados usado?
Você não disse qual o banco.
Cada banco tem um utilitário diferente, e trabalha de jeito diferente.
Mas em linhas gerais, esses utilitários funcionam como se você quisesse dar um monte de INSERTS em alguma tabela, a partir de dados lidos de um arquivo em formato texto e em algum formato que está especificado na documentação do banco. Para mais detalhes, leia a documentação do seu banco.
Giulliano
eu uso MS-SQL
vou dar uma busca na net pelo assunto…
por hora estou achando melhor não fazer o upload do arquivo e sim deixar implícito na aplicação que o arquivo deve estar no “C:/” com nome arquivo.txt