Резервное копирование HashMap в файл при каждом обновлении в Java - PullRequest
0 голосов
/ 19 января 2020

Я задаюсь вопросом о лучшем способе резервного копирования хеш-карты на диск при каждом вызове карты .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) решением, но я все равно не вижу, чтобы сделать это для каждого отдельного обновления. У кого-нибудь есть альтернатива или улучшение кода?

...