Ir ao conteúdo

Gabriel Barbosa Brandao

Membro Pleno
  • Posts

    38
  • Cadastrado em

  • Última visita

  1. Estou gerando uma matriz muito grande de números aleatórios, a matriz tem o tamanho de 20.000X20.000 (400 Milhões de posições) como a matriz é muito grande precisei aumentar o tamanho da heap da JVM (para evitar o erro Exception in thread “main” java.lang.OutOfMemoryError: Java heap space) compilando usando o seguinte comando: java -jar -Xms0m -Xmx4G Teste.jar Até aí ok, quando eu uso o range de números aleatórios de 0 à 10, o programa executa tranquilo, mas quando eu aumento o range para 0 à 100.000.000 eu recebo o erro Java heap space novamente. Gostaria de entender o porque isso acontece, já que o tamanho de um inteiro é sempre 4bytes, independente de que valor seja esse inteiro, não é ?? Logo não deveria faltar espaço para a JVM apenas porque aumentei o range dos números aleatórios mesmo mantendo o tamanho da matriz. Segue o código: Teste.java: /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package teste; import java.util.ArrayList; import java.util.Random; public class Teste { public static int TAM = 20000; private static final int rangeNumerosAleatorios = 100000000;//11; public static ArrayList<ArrayList<Integer>> matrizDeNumeros; public static void main(String[] args) { System.out.println(Thread.currentThread().getName()); preencherMatriz(); System.out.println("Matriz preenchida"); //imprimirMatriz(); } public static void preencherMatriz() { Random numero = new Random(2); // inicia semente para sempre gerar a mesma matriz ArrayList<Integer> linha; matrizDeNumeros = new ArrayList<ArrayList<Integer>>(TAM); for (int i = 0; i < TAM; i++) { linha = new ArrayList<Integer>(); for (int j = 0; j < TAM; j++) linha.add(numero.nextInt(rangeNumerosAleatorios)); matrizDeNumeros.add(linha); // adiciona uma linha a cada posição, formando uma matriz } } public static void imprimirMatriz() { for (int i = 0; i < matrizDeNumeros.size(); i++) { for (int j = 0; j < matrizDeNumeros.get(i).size(); j++) System.out.print(matrizDeNumeros.get(i).get(j) + " "); System.out.println(""); } } } Saída quando executo com TAM = 20000 e rangeNumerosAleatorios = 100000000;
  2. @AdrianoSiqueira como eu poderia fazer só na variável?!
  3. @AdrianoSiqueira Agradeço a ajuda, entendi agora que o quando uso synchronized no método ele sincroniza a instancia do respectivo objeto, no caso da minha aplicação há uma variável estática que pertence a classe e não à instancia, nesse caso eu precisaria sincroniza-la na classe e não no método, da seguinte forma: public void run() { synchronized (ThreadRunnable.class) { i++; System.out.println(Thread.currentThread().getName() + ":->" + i); } }
  4. Bom dia, estou tentando representar um exercício simples para trabalhar com Threads em Java, hoje tentei implementar um programa que cria 4 Threads e cada uma acessa uma variável compartilhada que faz o incremento da mesma, a intenção é evitar que mais de uma thread acesse essa variável ao mesmo tempo usando a palavra reservada synchronized. Porém quando executo meu código varias vezes, há algumas situações que aparentemente mais de uma thread é acessada ao mesmo tempo. Por exemplo: saída recebida: Thread-3 2 Thread-0 1 Thread-1 2 Thread-2 3 pois a saída esperada era: Thread-3 0 Thread-0 1 Thread-1 2 Thread-2 3 Não necessariamente nessa ordem de thread, mas obrigatoriamente os números em negrito devem ser únicos. Gostaria de saber porque a palavra reservada synchronized não está surtindo efeito, e o código está executando como se não a tivesse. Segue o código do programa: Class ThreadRunnable.java: package com.threads.implementacao; import java.util.logging.Level; import java.util.logging.Logger; public class ThreadRunnable implements Runnable { private String nome; private int tempo; public static int i = -1; public ThreadRunnable(String nome, int tempo) { this.nome = nome; this.tempo = tempo; Thread t = new Thread(this); t.start(); } @Override public synchronized void run() { i++; System.out.println(Thread.currentThread().getName() + ":" + i); } } Class ThreadExecute.java: package com.threads.implementacao; public class ThreadExecute { public static void main(String[] args) { ThreadRunnable thread1 = new ThreadRunnable("#0", 500); ThreadRunnable thread2 = new ThreadRunnable("#1", 500); ThreadRunnable thread3 = new ThreadRunnable("#2", 500); ThreadRunnable thread4 = new ThreadRunnable("#3", 500); System.out.println(Thread.currentThread().getName()); } }
  5. @V!OLADOR acho que pode ser isso então porque na main eu chamo a função "inicializa()" que carrega as matrizes inclusive a identidade, não sei se ela pode estar sendo chamada durante o loop, mas provavelmente deve ser algo relacionado ao carregamento da matriz identidade logo após alterar a gluLookAt(). Não postei o código todo porque ele ta meio desorganizado ainda, e na vdd essas são as únicas funções que atuam diretamente na alteração da câmera, mas eu vou dar mais uma revisada no código e caso não consiga solucionar eu retornarei aqui com o código em íntegra.
  6. @devair1010 aqui está o código com funções responsáveis por alterar o posicionamento da câmera, atualmente apenas a função de avançar está sendo desenvolvida: vec3 olho; vec3 alvo = {0, 0, 0}; float _raioDaCamera=30; float _phi = 90; float _teta = 90; float Sen (float angulo){ return sin(angulo*M_PI/180); } float Cos (float angulo){ return cos(angulo*M_PI/180); } vec3 convertePCartesiano(float raioCamera, float phi, float teta){ float x = raioCamera*Sen(phi)*Sen(teta); //x float y = raioCamera*Cos(phi); //y float z = raioCamera*Sen(phi)*Cos(teta); //z if(x > 0 && x < 0.0001) x = 0; if(y > 0 && y < 0.0001) y = 0; if(z > 0 && z < 0.0001) z = 0; vec3 vetor (x, y, z); return vetor; } void updateCamera (float raioCamera, float phi, float teta){ olho = convertePCartesiano(raioCamera, phi, teta); alvo = (-1.0f) * olho; gluLookAt(olho.x, olho.y, olho.z, alvo.x, alvo.y, alvo.z, 0, 1, 0); } vec3 normalize(const vec3 &vetor){ float norma = sqrt(pow(vetor.x, 2) + pow(vetor.y, 2) + pow(vetor.z, 2)); if(norma > 0) return vec3(vetor.x/norma, vetor.y/norma, vetor.z/norma); return vec3(0, 0, 0); } float magnitude (vec3 &vetor){ return sqrt(pow(vetor.x, 2) + pow(vetor.y, 2) + pow(vetor.z, 2)); } void avanca(){ vec3 direcao = alvo; direcao = normalize(direcao); vec3 velocidade = direcao * (0.25f); olho = olho + velocidade; _raioDaCamera = magnitude(olho); updateCamera(_raioDaCamera, _phi, _teta); } void eventoDeTeclado(unsigned char key, int x, int y){ switch(key){ case 'q': case 'Q': exit(0); break; case '+': if(raio < 11.12) raio += 0.12; break; case '-': if(raio > 6.32) raio -= 0.12; break; case 'w': case 'W': avanca(); break; default: break; } glutPostRedisplay(); }
  7. Estou implementando uma camera orbital ao redor de um desenho feito no centro do sistema de referencial universal, estou usando o opengl e a biblioteca glm; eu consegui fazer a camera se aproximar do objeto quando aperto W, porém a aproximação adequada só acontece quando pressiono W e mexo no tamanho da janela, pois se eu não fizer esse ritual a imagem fica toda desalinhada. Acredito que seja algo relacionado a atualização da gluLookAt estou usando glutPostRedisplay após atualizar a posição da camera porém mesmo assim o bug continua, alguém já passou pelo mesmo problema, ou faz ideia de como eu possa resolver
  8. @Um mero usuário Eu tava pensado em fazer algo mais simples, e gostaria de usar as ferramentas já existentes e não criar uma. Pensei por exemplo na situação pandêmica atual, e pesquisei alguns achados do Covid-19 e percebi que a tomografia computadorizada ou até a tomografia de tórax estão sendo usados como auxiliar para o diagnostico do vírus, pensei que poderia então unir um banco de dados de imagens de TC e passar eles por um processo de segmentação usando o algoritmo SLIC para classificar em 2 classes, em seguida usar um algoritmo K-NN para classificar o resto do meu banco de dados e tirar qual a acurácia dessa classificação. Segue abaixo algumas etapas do processo: Porém gostaria de outra ideia, além dessa.
  9. Olá, estou fazendo um curso de Tópicos em Visão Computacional e gostaria de idéias simples que eu possa implementar fazer usando software como ImageJ, Pynovisao e Weka, exemplo de idéias seria identificar em uma plantação a presença de soja, capim e ervas daninhas usando segmentação, extração de atributos e um classificador para isso, gostaria de uma ideia nesse nível.
  10. @Doctah gostaria de saber como foi o projeto, amigo !!
  11. @kgin vou dar uma olhada na biografia!!
  12. @arfneto Dei uma olhada na definição de pipe, pois não consegui acessar o link que compartilhou. Quanto ao livro achei interessante, irei procurar o PDF dele na internet.
  13. @GusGraf Não funcionou também. Fui obrigado a reinstalar o Linux
  14. @kgin É exatamente isso que eu estava procurando. Sabe me informar onde eu posso achar um manual ou referencias e mais exemplos de redirecionamento de entrada ou saida, como esse "grep" ? Procuro algo como um cplusplus disso.
  15. Galera, estou programando exercícios do URI em C++ e estou usando a linha de comando para compilar, executar e ler entrada para o programa. Sei que no Linux para compilar se usa: g++ -o prog prog.cpp e para executar: ./prog e para ler uma entrada de um txt se usa: ./prog < entrada.txt Tenho algumas dúvidas, 3 pra ser mais específico: Gostaria de saber qual o nome desse tipo de execução por linha de comando ? Existe algum outro tipo execução por linha de comando que possa facilitar minha vida ? Qual é o correspondente desses comandos no Windows ?

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...