Ich hab hier ein RandomAccessFile, was serialisierte Datenblöcke unterschiedlicher Grösse (zwischen 1KB und 100MB) enthält. Jetzt soll das File reorganisiert - also gelöschte Blöcke entfernt - werden.
Also von vorne nach hinten durch eine Liste mit den Blöcken gehen, Datenblock lesen und weiter vorne wieder wegschreiben.
Funktioniert mit normalem IO ganz gut, ich hab das jetzt nach NIO umgeschrieben und es ist auch schon etwas schneller geworden.
Was mich an der derzeitigen Programmierung stört ist das ständige Neuanlegen des ByteBuffers. Konstante Buffergrösse geht leider nicht weil die Chunks unterschiedliche Grösse haben. Nur einen Teil eines grösseren Buffers zu nutzen hab ich nicht gefunden.
Kann man die Datei nicht komplett in den Speicher mappen und dann die MMU die Arbeit erledigen lassen? channel.transferTo/transferFrom geht anscheinend nur wenn unterschiedliche Channels genutzt werden.
Oder irgendeine andere Idee?
Hier das Stückchen Code:
Bernd
Also von vorne nach hinten durch eine Liste mit den Blöcken gehen, Datenblock lesen und weiter vorne wieder wegschreiben.
Funktioniert mit normalem IO ganz gut, ich hab das jetzt nach NIO umgeschrieben und es ist auch schon etwas schneller geworden.
Was mich an der derzeitigen Programmierung stört ist das ständige Neuanlegen des ByteBuffers. Konstante Buffergrösse geht leider nicht weil die Chunks unterschiedliche Grösse haben. Nur einen Teil eines grösseren Buffers zu nutzen hab ich nicht gefunden.
Kann man die Datei nicht komplett in den Speicher mappen und dann die MMU die Arbeit erledigen lassen? channel.transferTo/transferFrom geht anscheinend nur wenn unterschiedliche Channels genutzt werden.
Oder irgendeine andere Idee?
Hier das Stückchen Code:
Java:
FileChannel fc = rafCache.getChannel();
ArrayList<Chunk> lstNew = new ArrayList<Chunk>();
long lngNewOffset = 0;
int size = lstChunk.size();
for (int i = 0; i < size; i++) {
Chunk c = lstChunk.get(i);
if (c.intIdx == -1) continue; // empty chunk
// read chunk
ByteBuffer bb = ByteBuffer.allocateDirect(c.intSize);
fc.read(bb, c.lngOffset);
// create new chunk entry
[...]
n.lngOffset = lngNewOffset;
// write chunk back
bb.flip();
fc.position(n.lngOffset);
while (bb.hasRemaining())
fc.write(bb);
lngNewOffset = lngNewOffset + c.intSize;
}
Bernd