MyFileSystem - criar um arquivo de 250MB. Como?

Olá, pessoal!

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.

Valeu!

Ola,

Qual o erro exatamente? Cole a stacktrace.

Ah, e descubra aqui como aumentar a memoria da maquina virtual, se for o caso.

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”.

Mas, se tudo o que vc quiser eh criar um arquivo de 250mb, um bom

dd if=/dev/zero of=arquivo_de_250mb.disk bs=1024 count=250000

ja resolve :wink:

e o BufferedOutputStream com um lindo for?

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.

0000    23 69 6E 63 6C 75 64 65  20 3C 73 74 64 69 6F 2E   #include <stdio.
0010    68 3E 0D 0A 23 69 6E 63  6C 75 64 65 20 3C 73 74   h>..#include <st
0020    64 6C 69 62 2E 68 3E 0D  0A 23 69 6E 63 6C 75 64   dlib.h>..#includ
0030    65 20 3C 73 74 72 69 6E  67 2E 68 3E 0D 0A 23 69   e <string.h>..#i
0040    6E 63 6C 75 64 65 20 3C  69 6F 2E 68 3E 0D 0A 0D   nclude <io.h>...
0050    0A 2F 2A 2A 2A 2A 2A 2A  2A 2A 2A 2A 2A 2A 2A 2A   ./**************
0060    2A 2A 2A 2A 2A 2A 2A 2A  2A 2A 2A 2A 2A 2A 2A 2A   ****************
*
0080    2A 2A 2F 0D 0A 2F 2A 20  50 52 4F 43 55 52 41 20   **/../* PROCURA

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?

Valeu

Já pensou em não fazer em Java?

Já!

Mas tem de ser em Java.
O trabalho é parte de um projeto maior. Mudar essa parte, requer alterar todo o projeto.

Alguém tem sugestão útil?

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.

Algué aí sabe?

Valeu pela ajuda