2016-07-06 4 views
1

Я использую v3.9.0 хронологической карты, где у меня есть два процесса, в которых процесс A пишет ChronicleMap и Process B, только инициализируется с тем же постоянным файлом, который использует A. После загрузки я печатаю Map.size в Process A и Process B, но у меня получается другой размер карты. Я ожидаю, что оба размера будут одинаковыми. В каких случаях я могу увидеть это поведение?Chronicle Map v3.9.0, возвращающий разные размеры

Как устранить эту проблему? Существует ли какая-либо операция промывки?

Одна вещь, которую я пытался сделать, - это выгрузить файл с помощью метода getAll, но он сбрасывает все как json в одном файле, который в значительной степени убивает любого из моих редакторов. Я попытался использовать MapEntryOperations в Process B, чтобы увидеть, что-то интересное происходит, но похоже, что оно в основном вызывается, когда что-то записывается на карту, но не тогда, когда Map инициализируется непосредственно из постоянного хранилища.

ответ

2

Я использовал createOrRecoverPersistedTo вместо createPersistedTo метода. Из-за этого в моем другом процессе не было всего данных.

Как описано в разделе Recovery в учебнике конкретизирует:

.recoverPersistedTo() необходимо для доступа к Храм Карты исключительно. Если параллельный процесс обращается к карте хроники, а другой процесс пытается выполнить восстановление, результат операций на стороне процесса доступа и результаты восстановления не определены. Данные могут быть повреждены дальше. Вы должны убедиться, что никакой другой процесс не имеет доступа к Хранилищу хроники в магазине при вызове .recoverPersistedTo() в этом магазине. »

0

Это кажется довольно странным. Размер в хронике Карта не сохраняется в одном месте памяти. ChronicleMap.size() просматривает и суммирует размер каждого сегмента. Таким образом, размер «слабо согласован», и если один процесс постоянно записывает на карту, вызовы из нескольких потоков/процессов могут возвращать несколько разные значения. Но если никто не пишет на карту (например, в вашем случае сразу после загрузки, когда процесс A еще не начал писать), все вызывающие должны увидеть одно и то же значение.

Вместо getAll() и анализ вывода вручную, вы можете попробовать «количество» записи что-то вроде

int entries = 0; 
for (K k : map.keySet()) { 
    entries++; 
} 
+0

Сегодня я попытался применить предложенный вами способ, и он не показывает мне правильные результаты. почти 50%. Есть ли способ диагностировать проблему? Я могу последовательно воспроизвести ее в своей системе (среда Windows). К сожалению, я не смогу опубликовать код. – vijar

+1

Используете ли вы 'createPersistedTo() 'или' createOrRecoverPersistedTo() 'в процессе B, чтобы открыть карту? Можете ли вы также попробовать запустить ваш случай в среде Linux? – leventov

+0

Я использую' createOrRecoverPersistedTo() ' – vijar

Смежные вопросы