Tenho um projeto que carrega imagens TIFF, mas antes disso ele precisa converter o file para bytes[]…eu utilizo o codigo
[code] File file = new File(path + “.tif”);
byte [][] images = new byte[1][];
FileInputStream fis = new FileInputStream(file);
FileChannel fc = fis.getChannel();
long len = fc.size();
if (len > Integer.MAX_VALUE)
throw new Exception("The file is too big");
byte[] dataFile = new byte[(int)len];
ByteBuffer bb = ByteBuffer.wrap(dataFile);
fc.read(bb);
images[0] = dataFile;[/code]
Acontece que quando o tive ultrapassa ± 50 megas, da erro de memória quando ele esta na linhas fc.read(bb);
ja aumentei a memoria com -Xmx512m -Xms512m…tem alguma forma de melhorar a perfomance ou tratar esse erro para não travar a aplicação?
Pergunta imbecil número um - o que ocorre se você NÃO usar NIO? O consumo de memória continua alto?
A unica coisa que eu preciso é do array de bytes da imagem, e não sei outra forma de fazer isso, aceito sugestões
Grato,
Escrevi o programa abaixo, e com ou sem NIO o consumo parece igual. (É o que deveria ser, mas sabe como é que é…)
import java.io.*;
import java.nio.*;
import java.nio.channels.*;
class TesteFIS {
public static void main(String[] args) throws IOException {
// Primeiramente vamos criar um arquivo de 100 MB
System.out.println ("Criando um arquivo de teste...");
OutputStream os = new FileOutputStream ("teste.bin");
int fileLength = 100 * 1024 * 1024;
int blockCount = 1024;
byte[] buf = new byte[fileLength / blockCount];
for (int i = 0; i < blockCount; ++i) {
os.write (buf);
}
os.close();
buf = null;
// Agora vamos medir a quantidade de memória. Vou usar "System.gc"
// só para ter uma medida confiável.
for (int i = 0; i < 10; ++i) {
System.out.println ("Lendo o arquivo sem NIO");
System.gc(); try { Thread.sleep (1000); } catch (InterruptedException ex) {}
System.gc(); try { Thread.sleep (1000); } catch (InterruptedException ex) {}
// Lendo o arquivo em memória só com FileInputStream
InputStream is = new FileInputStream ("teste.bin");
long m1 = Runtime.getRuntime().freeMemory();
byte[] bytes = new byte [fileLength];
is.read (bytes);
is.close();
System.gc(); try { Thread.sleep (1000); } catch (InterruptedException ex) {}
System.gc(); try { Thread.sleep (1000); } catch (InterruptedException ex) {}
long m2 = Runtime.getRuntime().freeMemory();
System.out.println ("Diferença de memória: " + ((m1 - m2) / 1024) + " kbytes");
bytes = null;
// Lendo o arquivo em memória com NIO
System.out.println ("Lendo o arquivo com NIO");
System.gc(); try { Thread.sleep (1000); } catch (InterruptedException ex) {}
System.gc(); try { Thread.sleep (1000); } catch (InterruptedException ex) {}
m1 = Runtime.getRuntime().freeMemory();
FileInputStream fis = new FileInputStream("teste.bin");
FileChannel fc = fis.getChannel();
byte[] dataFile = new byte[fileLength];
ByteBuffer bb = ByteBuffer.wrap(dataFile);
fc.read(bb);
fis.close();
System.gc(); try { Thread.sleep (1000); } catch (InterruptedException ex) {}
System.gc(); try { Thread.sleep (1000); } catch (InterruptedException ex) {}
m2 = Runtime.getRuntime().freeMemory();
System.out.println ("Diferença de memória: " + ((m1 - m2) / 1024) + " kbytes");
}
}
}
vlw thingol, vo testa aqui com o seu exemplo e depois eu comento…
engraçado uma coisa…se eu abro a imagem em algum visualizador, a imagem aparece corretamente…agora…no meu visualizador ela aparece espelhada! alguem ja teve esse problema???
O ponto 0,0 (origem das coordenadas) fica no canto superior esquerdo ou no campo inferior esquerdo?
Isso faz diferença, hein!
mas, onde que isso é passado para acontecer isso???
fica na parte superior esquerda…