Trabalhar com grandes matrizes

4 respostas
cos30

e ai pessoal, estou necessitando de ajuda!!

estou em um projeto q indexa documentos, formando uma matriz do tipo palavras por documentos. Imaginem q eu tenha q indexar 1000 documentos e tendo no total mais de 10000 palavras. Quando eu instancio uma matriz dessa dimensão dá OutOfMemoryException “estouro de memória”. Alguem, por favor, poderia dar uma luz pra eu resolver esse problema???

Estava pensando em aumentar a memória heap do java com o atributo -Xmx… (mas mesmo assim as matrizes são enormes…)

será q eu posso utilizar arquivo pra mapear a matriz (existe alguma estrutura q faça isso)??? como q os grandes coletores web (crawler) indexam grandes conteúdos e carregam pra memória???

4 Respostas

T

Tio, não use uma matriz.
Sério. Se o Google usasse uma matriz ele nem tinha conseguido sair do papel, quanto mais virar um negócio de bilhões de dólares.

É melhor usar o Lucene, que faz isso direitinho para você. Não reinvente a roda.

http://lucene.apache.org/

Para usar o Lucene como um web crawler, cheque o projeto Nutch:

http://lucene.apache.org/nutch/

cos30

o cara!! valew pela dica, mas na verdade depois de formar essa matriz eu tenho q realizar uma operação de decomposição (operação de SVD na matriz de termo por documento), então… ainda eu necessito de uma estrutura como matriz… não é apenas um simples crawler!!!

ainda tenho dúvida de como trabalhar com essa matriz (ou outra estrutura)!!??

T

Você precisa determinar as freqüências de cada palavra em cada documento indexado, é isso?

Só para quebrar seu galho, vou lhe mostrar uma forma bem simples de fazer isso.

Para facilitar, será necessário percorrer cada documento duas vezes (uma para determinar a lista de palavras, a segunda para calcular as freqüências.) Como são 10000 documentos isso deve ser razoavelmente rápido.

Primeiramente, crie um TreeMap<String,Integer> para conter as palavras lidas de todos os documentos. A chave é a palavra, e o valor é um número seqüencial que inicia por 0, que seria o índice da palavra. Esse TreeMap vai conter umas 10000 entradas, o que é pouco.

Depois, crie um array bidimensional de inteiros - esse array vai conter apenas 40 MB (10 milhões de entradas, cada uma com 4 bytes). Isso você pode ajustar no -Xmx - use -Xmx512M ou um pouco maior, de acordo com a memória de sua máquina. Uma das dimensões é o índice da palavra, e a outra o número do documento.

A seguir, leia novamente os documentos, e procure cada string no TreeMap que você criou no passo 1. Para cada palavra, pegue o índice da palavra, e incremente a freqüência no array bidimensional criado no passo 2.

Como você disse que tem de calcular o SVD desse array, pode até ser um array de double (nesse caso você vai precisar de 80 MB) - um array de float pode ter problemas de instabilidade quando você vai fazer os cálculos.

cos30

ehhh… eu vou usar mesmo uma tabela Hash e também o esquema de arquivo invertido pra armazenar as palavras! agora é procurar uma boa maneira de calcular o SVD, as bibliotecas em java (Jama, Colt, JLapack) não estão mostrando o mesmo tempo do que aqueles encontrados pela operação de SVD do Matlab!!

muito obrigado!

Criado 21 de fevereiro de 2008
Ultima resposta 22 de fev. de 2008
Respostas 4
Participantes 2