Domanda

Sono in procinto di fare alcune modifiche a una libreria che sto usando. Al fine di ridurre l'utilizzo della memoria la libreria sta scrivendo i propri dati temporanei sul disco invece di tenerla in memoria. Tuttavia, per il mio scenario di utilizzo è più efficiente di tenerlo in memoria. Essa ha anche alcuni problemi di concorrenza, perché ha i nomi di costanti per le sue temporanei-files e quindi non può essere eseguito contemporaneamente in diversi thread (perché i fili saranno corrotti di ogni altri dati).

Ho quindi bisogno di cambiare la libreria in modo che mantiene tutti i dati in memoria, invece. Non ho originariamente scritto la libreria e non sono quindi molto confortevole con fare cambiamenti drastici al codice. Mi piacerebbe pertanto piace farlo con il meno possibile di refactoring. Il codice che scrive su disco è abbastanza semplice. Ecco un (alquanto semplificata) esempio:

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

La lettura di un blocco è molto simile (cioè esso utilizza una FileChannel, che si ottiene da un RandomAccessFile).

Ci si sente come la soluzione più semplice sarebbe se posso usare un po 'di attuazione FileChannel, che mappa ad un posto nella memoria invece di un file. So che posso mappare un file a un posto nella memoria usando la mappa metodo di FileChannel. Tuttavia, questo è il contrario. Questo mi dà una "memoria-API" in un file. Voglio un FileChannel interfaccia contro po 'di memoria. Ci sono delle implementazioni disponibili di questo?

È stato utile?

Soluzione

Java 7 permetterà filesystem pluggable, così sarete in grado di utilizzare un filesystem di memoria base e mantenere le API FileChannel corrente. In mancanza di ciò è molto probabile che dover cambiare l'API si utilizza per Commons-VFS come suggerisce Adrian o utilizzare memoria solo le strutture.

Altri suggerimenti

Forse è possibile utilizzare un filesystem in memoria, come ad esempio Apache Commons VFS .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top