Pergunta

Estou fazendo algumas alterações em uma biblioteca que estou usando. Para reduzir o uso da memória, a biblioteca está escrevendo seus dados temporários no disco, em vez de mantê -los na memória. No entanto, para o meu cenário de uso, é mais eficiente mantê -lo na memória. Ele também possui alguns problemas de simultaneidade, porque possui nomes constantes para seus arquivos de temperatura e, portanto, não podem ser executados simultaneamente em diferentes encadeamentos (porque os threads corromperão os dados um do outro).

Portanto, preciso alterar a biblioteca para manter todos os seus dados na memória. Originalmente, não escrevi a biblioteca e, portanto, não me sinto muito confortável em fazer mudanças drásticas no código. Portanto, gostaria de fazer isso com o mínimo de refatoração possível. O código que grava no disco é bastante simples. Aqui está um exemplo (um tanto simplificado):

final FileChannel fileChannel = this.randomAccessFile.getChannel();
fileChannel.position(calculatePosition());
while (blockData.hasRemaining())
{
 fileChannel.write(blockData);
}

A leitura de um bloco é muito semelhante (ou seja, ele usa um Filechannel, que recebe de um RandomAccessFile).

Parece que a solução mais fácil seria se eu pudesse usar alguma implementação do FileChannel, que mapeia para um local na memória em vez de em um arquivo. Eu sei que posso mapear um arquivo para um local na memória usando o Map-Method do Filechannel. No entanto, esse é o contrário. Isso me dá um "Api de memória" para um arquivo. Eu quero uma interface filechannel contra alguma memória. Existem implementações disponíveis disso?

Foi útil?

Solução

O Java 7 permitirá sistemas de arquivos em fusão, para que você possa usar um sistema de arquivos baseado em memória e manter a API atual do FileChannel. Além disso, é provável que você precise alterar a API que você usa para o Commons-VFs, como Adrian sugere ou usará apenas a memória estruturas.

Outras dicas

Talvez você possa usar um sistema de arquivos na memória, como Apache Commons VFS.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top