Я задаюсь вопросом о лучшем способе резервного копирования хеш-карты на диск при каждом вызове карты .put. В настоящее время я закодировал разделение каждого записываемого объекта в файл, где его хеш-код является именем файла, а содержимое - хэш-картой записей, которые соответствуют (в случае коллизий)
private File val2file(K k) {
int hash = k.hashCode();
//bitsIgnored if we ever want to store multiple objects per file
hash = hash >>> bitsIgnored;
return new File(rootDir, Integer.toString(hash));
}
с
File toEdit = val2file(k);
ReentrantLock tempLock = new ReentrantLock();
ReentrantLock lock = lockMap.putIfAbsent(toEdit, tempLock);
if(lock == null) {
lock = tempLock;
}
lock.lock();
try {
HashMap<K, V> storageMap;
if(toEdit.exists()) {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(toEdit));
Object obj = ois.readObject();
ois.close();
storageMap = (HashMap<K, V>) obj;
} else {
storageMap = new HashMap<>();
}
storageMap.put(k, v);
ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(toEdit)));
oos.writeObject(storageMap);
oos.close();
} catch(FileNotFoundException ex) {
Logger.getLogger(MapSaver.class.getName()).log(Level.SEVERE, null, ex);
} catch(ClassNotFoundException ex) {
Logger.getLogger(MapSaver.class.getName()).log(Level.SEVERE, null, ex);
} catch(IOException ex) {
if(lock.isLocked()) lock.unlock();
throw ex;
} finally {
if(lock.isLocked()) lock.unlock();
}
Это работает, и я проверил его на 1000 обновлений в секунду, с ограничивающим фактором, являющимся сериализатором (ЦП) и входом / выходом накопителя из-за количества файлов, на которые он записывает. Я пробовал некоторые решения для баз данных и другие решения «карта в файл», предлагаемые здесь , но ни одно из них не кажется таким быстрым Я предпочел бы одно файловое решение по сравнению с моим (n file) решением, но я все равно не вижу, чтобы сделать это для каждого отдельного обновления. У кого-нибудь есть альтернатива или улучшение кода?