Olá pessoal, vou descrever o cenário para que vocês possam quem sabe me dar um auxilio:
Problema 1.
Tenho um sistema que faz a leitura de arquivos no formato csv ou txt respectivamente separados por [i]ponto e virgula[/i], estes arquivos possuem tamanhos variáveis que vão de 200.000 a 1.000.000 de linhas de dados, o que ocorre é que eu estou utilizando para separar estes dados, o comando split(";"), porem quando o arquivo é muito grande, ele começa a dar o famoso estouro de heap e ai tenho que aumentar a memória da JVM. só que além do split ainda preciso remover alguns caracteres e fazer outras conversões de tipos na leitura depois do split e então esta havendo um consumo muito grande de memória no sistema.
Problema 2
Outro problema que estou tendo é que depois da leitura dos arquivos citados acima, eu os armazeno em listas List e também, não somente neste procedimento mas sim em toda a aplicação faço o uso de listas de objetos para passagem de parâmetros entre métodos, até que estes dados cheguem ou retornem do banco de dados, porem estou com duvidas se este procedimento é o mais indicado para tal. Pois devido ao grande volume de dados estou tendo problemas de Estouro de Heap.
Para contornar o problema 1 e 2 utilizei os parametros da JVM: -Xmx e -Xms para aumentar a memória da mesma, porem gostaria de saber se existe alguma outra forma de resolver isso? atualmente o sistema é utilizado no modelo cliente/servidor, através do protocolo jnlp o pessoal faz o download das atualizações para a maquina local, ai fica complicado configurar isso sempre que alguem faz um novo download do aplicativo. Outro detalhe é que estou querendo migrar o mesmo para uma aplicação com front-end para web para que os processos sejam feitos todos no servidor, e ai estou com receio de ficar mais complicado ainda devido ao grande numero de dados como citado acima.
Duvida 3.
O Uso excessivo de casting como nos exemplos abaixo consomem mais memória? são praticas aplicáveis ou recomendáveis?:
public Object getProduto(int idEmpresa) {
// procedimentos para buscar no banco
return new Produto(rs.getInt("id_produto"), rs.getString("descricao"));
}
// em algum lugar da aplicação
Produto meuProduto = (Produto) getProduto(10);
ou deste tipo:
public void inserir(Object obj) {
Connection con;
PreparedStatement pst = null;
con = Conexao.getConnection();
pst = con.prepareStatement("insert into produtos (id_produto, descricao) values (?,?)");
pst.setInt(1, ((Produto) obj).getIdProduto());
pst.setString(2, ((Produto) obj).getDescricao());
pst.executeUpdate();
}
ou este tipo de utilização em excesso no sistema pode dar problemas, qual a opinião de vocês quanto a isto, existe uma solução melhor para isso, para acesso a dados estou utilizando jdbc.
Att,
André Dalcin