Я работаю над индексатором и хочу установить пороговое значение (в байтах), когда текущий индекс должен быть сброшен на диск, и должен быть создан новый индекс для размещения большего количества объектов.
В настоящее время я просто сбрасываю данные на основе количества документов, обработанных индексатором, но это кажется очень элементарным и не учитывает тот факт, что некоторые документы могут быть массивными (МБ). уровень) и другие очень маленькие (уровень КБ).
Я хочу минимизировать использование ЦП и памяти, поэтому об использовании какой-либо инструментальной библиотеки не может быть и речи, поскольку они действительно приводят к большим накладным расходам при выборке кучи.
Что я изучил:
- Я изучал возможность вычисления размера вручную, и хотя это дало бы приблизительную оценку, это кажется своего рода специальным исправлением и последним курорт.
- Используется библиотека времени выполнения, но она ненадежна из-за разных периодов циклов сборки мусора.
- Внешние библиотеки, такие как JOL, добавляют измеримые накладные расходы во время выполнения и являются запрещенными.
- Java 17
- Не слишком тяжелая память/процессор
Код: Выделить всё
private static final int MAX_IN_MEMORY_LENGTH = 10_000; // placeholder threshold
private final Map invertedIndex = new TreeMap();
if (shouldFlush()) {
batchFileWriter.writeIndex(invertedIndex, indexFileCounter);
invertedIndex.clear();
indexFileCounter++;
return;
}
private boolean shouldFlush() {
return invertedIndex.size() >= MAX_IN_MEMORY_LENGTH; // Very rudimentary check, use heap size later.
}
Каковы практические способы оценить или приблизить использование памяти структурой в памяти, такой как TreeMap, при этих ограничениях, чтобы я мог решить, когда выполнять сброс на диск? Меня устраивает любая стратегия оценки, если она не требует слишком много ресурсов и дает последовательную оценку.
Подробнее здесь: https://stackoverflow.com/questions/798 ... -by-a-tree
Мобильная версия