Estou com um probleminha no meu trabalho da facul. O objetivo é criar um sistem de arquivos, que é na verdade um arquivo gigante com tres seções: root, fat e dados. O tamanho da fat é de 64kB e o tamanho do MyCluster eh de 4KB. Entao, meu sistema de arquivos terá cerca de 250 MB, mas não estamos conseguindo criar um arquivo desse tamanho. O Java reclama da seguinte forma: Java Heap Space.
Se alguem ai souber como fazemos para criar um arquivo desse tamanho, por favor responda ao tópico.
Se vc estiver guardando todo o conteudo do arquivo de 250 megabytes em memória, a única opção que vc tem para fugir do problema de OutOfMemory é aumentar o tamanho maximo do heap (opcao -Xmx da linha de comando).
Contudo, imagine que vc queira criar um MyFileSystem de tamanho maior que a sua memória ram… essa solução (aumentar o tamanho do heap) não vai funcionar. Em um projeto similar, que fiz na faculdade tb, o que a gente fazia era manter em memória um cache de tamanho limitado das “paginas” do “disco”. Dessa forma seu filesystem nao fica preso a um tamanho maximo do “disco”.
a) A primeira coisa é representar o seu filesystem como um arquivo no disco, preferencialmente usando um RandomAccessFile.
b) Ponha um “layer” sobre o RandomAccessFile (ou seja, escreva uma classe que tenha um dos campos como uma RandomAccessFile) para que você veja esse arquivo como uma coleção de clusters (que é assim, simplificadamente, que aparece para o hardware; na verdade, o disco aparece como cilindros, cabeças e trilhas, mas fazendo algumas contas de multiplicação e adição você tem clusters). Cada cluster com 4 KB, por exemplo.
c) A seguir, crie o seu filesystem sobre esse layer que você acabou de criar. Muito simples.
Para você “debugar” seu FileSystem, lembre-se de ter também uma ferramenta que gere dumps de arquivos em hexadecimal. Talvez um editor de texto que leia em hexadecimal, como o Ultraedit, já baste.
Valeu, pessoal pela ajuda. Mas ainda não consegui criar o arquivo.
Aumentar a memória da máquina vitual é uma saída, mas limita o funcionamento do programa apenas ao meu computador.
O que estou tentando fz é criar o arquivo usando o ObjectOutputStream do Java. Pensei em criar o arquivo ao poucos, por exemplo, salvo cerca de 15MB no stream e depois mando pro arquivo, mando salvar no arquivo, chamo a garbage colector e faço tudo de novo (em um for) até chegar aos 250MB. Mas o problema está sendo fz um append no arquivo ao invés de sobrescrevê-lo, que é o que está acontecendo.
Alguém tem uma dica pra eu fz um append em um arquivo que usa o ObjectOutputStream como Stream?
Desisti de usar o ObjectOutputStream e estou usando agora o RandomAcessFile pq foi estremamente simples criar o arquivo do tamanho desejado. bastou instanciar um objeto File e usá-lo pra instanciar o objeto raFile do RandomAcessFile com o parametro “rw” e depois chamar
raFile.setLenght(<tamanho em bytes>);
e o arquivo foi criado quase q instantaneamente.
Agora o problema é como salvar meus objetos nesse arquivo, se os metodos da classe RandomAcessFile não aceitam um writeObject como na ObjectOutputStream.
Penso que vou ter de salvar byte a byte, mas não sei como transformar meus objetos em sequencias de bytes.