mapdb icon indicating copy to clipboard operation
mapdb copied to clipboard

MapDB is not reducing its size when all messages get deleted

Open prasaddige opened this issue 1 year ago • 3 comments

  1. Created MapdB, physical size of file db is 2.00 MB (2,097,152 bytes)
  2. Insert 1000 messages into mapdb. Physical size of mapdb increased to 10.0 MB (10,485,760 bytes)
  3. Deleted all entries from mapDB

Expected: size of DB file should go back to 2 MB Expected: Size of DB file stays at 10.0 MB

========================================================================= Sample code to reproduce: public static void main(String[] args) { File file = new File("myMapDB.db");

	DB fileDB = DBMaker.fileDB(file).closeOnJvmShutdown().make();

	HTreeMap<String, String> hTreeMap = fileDB
			.hashMap(MAP_NAME, Serializer.STRING, Serializer.STRING)
			.expireMaxSize(20000)
			.expireAfterCreate(1, TimeUnit.DAYS)
			.modificationListener(new StringRetryFileListener())
			.createOrOpen();


	System.out.println("File Size Before Insert=" + FileUtils.sizeOf(file) + ", No of Entries=" + hTreeMap.size());

	for(int i = 0; i < 1000; i++) {
		hTreeMap.put(""+i, str);
	}

	System.out.println("File Size After Insert=" + FileUtils.sizeOf(file) + ", No of Entries=" + hTreeMap.size());

	for (Entry<String, String> entry : hTreeMap.getEntries()) {
		hTreeMap.remove(entry.getKey());
	}

	System.out.println("File Size After Delete=" + FileUtils.sizeOf(file) + ", No of Entries=" + hTreeMap.size());

	System.out.println("SIZE=" + hTreeMap.size());
}

=========================================================================

Output

File Size Before Insert=2097152, No of Entries=0 File Size After Insert=10485760, No of Entries=1000 File Size After Delete=10485760, No of Entries=0

prasaddige avatar Nov 20 '23 22:11 prasaddige

Try calling DB.getStore().compact()

andrm avatar Nov 22 '23 09:11 andrm

Set compaction threshold on the map creator to trigger automatic compaction when cleared space reaches certain level of the allocated space (20% in the below example): .expireCompactThreshold(0.2)

igalkin avatar Mar 27 '24 10:03 igalkin

Try calling DB.getStore().compact()

Seems there is no way to that now with transaction store. #940

yoloz avatar Aug 01 '24 04:08 yoloz