Datomic: надежные настройки, позволяющие избежать тайм-аутов и ошибок нехватки памяти.

Я запускаю одно и то же приложение с поддержкой datomic на разных архитектурах с разным объемом памяти (1–16 ГБ). Когда я выполняю массовый импорт данных, я часто сталкиваюсь с тайм-аутами или ошибками нехватки памяти.

Изучив документацию, я наткнулся на этот полезный документэтого), которые, по-видимому, излагают лучшие практики для достижения хорошей производительности при интенсивном импорте.

Меня не столько интересует производительность, сколько то, чтобы импорт «просто работал». Это приводит к моему основному вопросу:

Какова минимальная сложность конфигурации, обеспечивающая завершение процесса импорта сколь угодно большого объема на данном компьютере?

Я понимаю, что эта конфигурация может быть функцией моей доступной памяти, это нормально. Я также понимаю, что это может быть не максимально эффективно; это тоже нормально. Но мне нужно знать, что это прекратится.


person MRocklin    schedule 18.08.2013    source источник


Ответы (1)


Распределение данных

Я думаю, что в вашем вопросе отсутствует важная информация о типе данных и их распределении и доступные показатели для вашей системы во время массового импорта. Почему?

Скорость транзакций Datomic ограничена стоимостью фоновых заданий индексирования, а стоимость этого индексирования зависит от распределения новых значений и размера вашей базы данных.

Это означает, что, например, если у вас есть проиндексированные атрибуты (то есть :db/index) и при массовом импорте значения этих атрибутов распределяются случайно, вы поместите много давление в заданиях индексирования, поскольку он перезаписывает постоянно растущее число сегментов. По мере роста размера вашей базы данных индексирование будет доминировать в работе транзактора и не сможет наверстать упущенное.

Память транзакций

Как описано в документации, чем больше памяти вы можете выделить object-cache-max, тем лучше. Это особенно важно, если ваши данные имеют много ограничений уникальности (например, db/unique), поскольку это не позволит транзактору многократно извлекать некоторые сегменты хранилища.

В зависимости от вашего распределения данных, увеличение параметров memory-index-threshold и memory-index-max может привести к тому, что ваш импорт будет работать дольше... до тех пор, пока задание индексирования не сможет выполняться. Кажется, это то, что происходит с тобой.

Рекомендации

Попробуйте уменьшить настройки memory-index-threshold и memory-index-max. Это может показаться нелогичным, но у вас будет гораздо больше шансов завершить любой импорт (конечно, это займет больше времени, но вы можете почти гарантировать, что они закончатся). Ключ в том, чтобы заставить транзакцию регулировать ваши (равноправные) запросы, прежде чем он не сможет догнать задания индексации.

person a2ndrade    schedule 18.08.2013
comment
Я удивлен, что все, что я могу сделать, это увеличить свои шансы. Вы говорите, что нет пуленепробиваемых настроек, чтобы гарантировать, что Datomic не упадет? - person MRocklin; 19.08.2013
comment
Вы мониторили свою систему? Знаете ли вы, откуда берутся тайм-ауты и проблемы с памятью (согласно метрикам Transactor)? - person a2ndrade; 19.08.2013
comment
@MRocklin, ты нашел способ решить свою проблему? Я по-прежнему думаю, что ключ в том, чтобы заставить транзакцию регулировать ваши (одноранговые) запросы, прежде чем он не сможет догнать задания индексации. Вы решили это по-другому? - person a2ndrade; 11.09.2013
comment
Обновление @MRocklin до последней версии Datomic может помочь вам blog.datomic.com /2014/03/datomic-adaptive-indexing.html - person a2ndrade; 25.03.2014