Estou precisando ler um arquivo texto com 5 milhões de registros. Tal arquivo possui um layout baseado em posições de colunas. Por exemplo: as 20 primeiras colunas indicam o identificador da linha.
Enfim, estou trabalhando num projeto, onde o legado utiliza utl_file para ler UMA LINHA POR VEZ, realizar uma série de validações e, por fim, persistir no banco.
Existe alguma artifício no java onde possa realizar a leitura de todo o arquivo de uma tacada só e, talvez, armazená-lo em memória em alguma estrutura para que sejam feitas as validações de forma iterativa.
Grato,
Bruno Giminiani
Não sei sua necessidade real, mas, apenas para sugerir, por que não armaneza e processa esse arquivo diretamente no banco de dados?
Se você utiliza o Oracle, existe o SQL-LOADER, para carregar arquivos texto que é excelente.
Digo isso pois passei por um problema parecido, tinha um sistema que lia um arquivo texto diariamente com 1 milhão de linhas e era um processo muito lento.
Fica aí a sugestão.
Mikhas
Carregar tudo na memória é roubada heim cara, ainda mais se tiver milhões de linhas mesmo.
Bem… eu tentaria 2 abordagens diferentes:
Leia uma linha, mapeie ela em um POJO/BEAN, faça as validações e persista por final. Lê a proxima linha, mapeia, valide, persista sucessivamente…
ou…
2. Utilize um ETL. Eu só conheço e uso o Pentaho.
G
Giminiani
Olá!!
Enfim, por uma definição, que ultrapassa minha alçada, a validação deverá ser feita em pl-sql. A procedure tem como objetivo realizar validações em arquivo texto( validação de tamanho de campos, se houve entrada numérica no campo texto, se o campo esperado é um email, etc. ). O grandes problemas consistem de performance e escalabilidade, visto que se trata de arquivos que, de cara, começaram com 50.000.000 de registros. O arquivo chega via ftp e é salvo em um diretório disponível.
O que é mais eficiente?
Ler linha por linha; realizar as devidas validações e, em seguida, gravar no banco ou
Gravar tudo em uma tabela temporária e realizar a iteração de validação em uma tabela?
Existe alguma forma mais eficiente de ler arquivo em pl-sql ao invés de ler linha a liha?