Carlos,

Antes de mais nada gostaria de me desculpar caso minha primeira mensagem
tenha soado um pouco ofensiva, não foi essa a intenção.

Em segundo lugar, acho que houve má interpretação de sua parte. Em momento
algum eu disse que a solução consumiria mais ou menos "memória". O que eu
coloquei em questão na solução com streams vs. XML foi relativo à
"performance". E mesmo em relação ao consumo de memória, isso é facilmente
resolvido utilizando-se o método readLine() do objeto BufferedReader.

E por fim, hoje ao reler meu texto, notei que não coloquei o exemplo correto
no trecho de código (acabei copiando e colando o próprio código original do
problema), mas espero que tenha ficado subentendido que eu pretendia
utilizar indexOf, ou um StringTokenizer ou mesmo uma RegExp para separar os
elementos da string em variáveis (o código original que tinha em mente pode
ser encontrado mais ao final dessa mensagem).

Pois bem, voltando ao assunto original, talvez eu não tenha sido muito claro
em minha explanação. Concordo com você que para chegar a uma conclusão real
sobre qual método é mais rápido torna-se necessária uma bateria de testes.
Mas como nenhum de nós até agora fez tais testes nessa massa de dados, temos
que trilhar uma solução teórica.

Vou detalhar aqui um pouco as premissas da qual eu parti para chegar nesse
raciocínio:

a) Um arquivo de dados XML ficará, sem dúvida alguma, muito maior do que um
arquivo TAB delimited. Logo, quantidade TOTAL de bytes que serão carregados
para a memória, checados e "parseados" (a língua portuguesa que me desculpe
por esta aberração) será muito maior na solução XML. Uma vez que qualquer
operação que envolva acesso à memória ou acesso ao disco em um computador
leva uma fração de tempo para ser executada, tudo isso representa perda de
performance.

b) Para uma rotina que busca por um caracter TAB no meio de uma string, a
razão diz que esta deve ser mais rápida do que uma que busque por TAGs
delimitadoras de início e fim dos dados. Não sei de que modo foram
programadas as máquinas virtuais Java, mas me parece óbvio que para qualquer
CPU é muito mais rápido encontrar um caracter em meio a uma string do que
encontrar duas strings (tags de início e fim) em meio a outra string.

c) Um parser XML, além de ter que buscar pelas TAGs delimitadoras, ainda tem
que checar se a estrutura do documento está perfeita e válida (por exemplo,
tags não finalizadas), o que representa um overhead adicional.

d) A solução, como descrevi em meu email anterior, não necessariamente
precisa carregar o arquivo em sua totalidade para a memória. É possível
fazer o processamento dos dados em partes utilizando-se o método readLine()
de BufferedReader ou então controlando-se manualmente um buffer de memória
para ler somente uma quantidade limitada de dados por vez.

Foram essas as premissas que me conduziram a tal raciocínio. Se o java fosse
uma linguagem compilada em bytecodes nativos do processador em que está
sendo executada, eu não teria a menor dúvida de que esse método seria pelo
menos umas 2 vezes mais rápido do que a solução em XML. Todavia, como o Java
roda dentro de uma máquina virtual, existe a possibilidade da solução XML se
equiparar à solução stream por conta de alguma otimização interna feita em
código nativo. Mas ainda assim,acho muito pouco provável essa possibilidade.

Claro que toda essa discussão está tomando um rumo mais acadêmico do que
prático, uma vez que você já disse ter começado a implementar uma solução em
XML. Qualquer uma das 2 soluções vai atender com segurança. Afinal, o grande
gargalo que se tem em um problema desses não é necessariamente a leitura dos
dados do arquivo XML ou do TXT e sim a escrita desses dados, via JDBC, no
banco de dados.

Implementei há poucos dias uma solução XML para inserir 8.000 registros em
um banco Oracle. Não tenho o que reclamar da performance do parse do XML
(utilizei SAX para tratar os dados). No meu caso específico, optei pelo XML
porque um dos campos de dados era um texto formatado em HTML e com quebras
de linha, o que me impedia logo de cara de utilizar um arquivo somente
texto. Pensei em utilizar serialização de objetos também mas achei melhor
utilizar XML por conta da portabilidade do formato.

Enfim, a solução que propus no email anterior visa basicamente reduzir a
quantidade de reprogramação dos sistemas (tanto dos cliente do servidor) e
aumentar a performance, em detrimento da portabilidade. Porém se tempo (quer
seja de desenvolvimento, quer seja de processamento) não é um problema, opte
sem dúvida por XML, pois a portabilidade vale a pena.

{}'s
David Rissato Cruz

PS: Segue abaixo o código que tinha em mente:

(...)

import java.util.*;
import java.io.*;

(...)
public void leDadosDoArquivo(String nomeArquivo) {

    // Define caracter delimitador, no caso TAB
    final String delimitador = " ";

    // Define variáveis
    BufferedReader br;
    String linha;

    try {
        // Cria buffered reader a partir de um FileReader do arquivo
desejado
        br = new BufferedReader(new FileReader(nomeArquivo));
        while ( (linha=br.readLine()) != null) {
            // Quebra a linha em parâmetros baseado no delimitador (TAB)
            StringTokenizer st = new StringTokenizer(linha, delimitador);

            // função hipotética que recebe o valor de 4 bancos e insere no
banco
            //insereValoresNoBanco(st.nextToken(), st.nextToken(),
st.nextToken(), st.nextToken());
            System.out.print(st.nextToken() + "   <->   ");
            System.out.print(st.nextToken() + "   <->   ");
            System.out.println(st.nextToken());
        }
        br.close();
    }
    catch (IOException e) {
      System.out.println("Ocorreu um erro na leitura do arquivo " +
nomeArquivo);
    }

}

-----Mensagem original-----
De: Carlos Santiago [mailto:[EMAIL PROTECTED]]
Enviada em: segunda-feira, 3 de fevereiro de 2003 07:50
Para: [EMAIL PROTECTED]
Assunto: [java-list] JAVA e XML


Olá a todos.
Está interessante a discussão sobre o uso de XML e JAVA
para o porcessamento de arquivos TXT que havíamos
proposto um tempo atrás.
Das opiniões que li, parace concenso de que o uso de XML
pode diminuir a carga de processamento e o consumo de
memória. A excessão do David que não "entendeu" por que
iria consumir menos memória, a explicação que tenho
colhido da literatura é que diferente da classe File que
carega o arquivo inteiro para a memória para processá-lo
a API de XML carrega apenas o DOM e não o seu conteúdo,
o que torna mais leve o consumo de memória. Mas isso tem
que ser passivo de teste.
Eu tenho trabalhado nesta questão e já desenvolvi uma
DTD e um arquivo XML de exemplo e vou processá-lo usando
o JDOM 0.8 beta. Tenho, também, desenvolvido uma
documentação sobre o assunto (está na versão 0.3 e tem
25 páginas em TXT), se alguém que está participando da
discussão quiser dar uma olhada neste material me avise
e eu mando o material.
Abraço
Carlos


--------------------------
Carlos Santiago
Programador JAVA
Equipe de implementação
Secretaria de Fazenda - MT
--------------------------




------------------------------ LISTA SOUJAVA ---------------------------- 
http://www.soujava.org.br  -  Sociedade de Usuários Java da Sucesu-SP 
dúvidas mais comuns: http://www.soujava.org.br/faq.htm
regras da lista: http://www.soujava.org.br/regras.htm
historico: http://www.mail-archive.com/java-list%40soujava.org.br
para sair da lista: envie email para [EMAIL PROTECTED] 
-------------------------------------------------------------------------

Responder a