В некоторых местах указывается период 2 ГБ. В некоторых местах указано, что это зависит от количества узлов.
Какова емкость базы данных Mnesia?
Ответы (3)
Довольно велико, если ваш вопрос: «Какова емкость хранилища базы данных mnesia, состоящей из огромного количества disc_only_copies
таблиц» - вы в значительной степени ограничены доступным дисковым пространством.
Более простой вопрос: какова максимальная вместимость одной таблицы мнезии разных типов. ram_copies
таблицы ограничены доступной памятью. disc_copies
таблицы ограничены их dets
серверной частью (Hakan Mattsson on Mnesia) - это ограничение 4Gb данных на данный момент.
Итак, простой ответ заключается в том, что простая таблица disc_copies
может хранить до 4 Гб данных, прежде чем они столкнутся с проблемами. (Mnesia на самом деле не дает сбоев, если вы превысите ограничение на размер на диске - часть таблицы ram_copies продолжает работать, поэтому вы можете исправить это, удалив данные или приняв другие меры во время выполнения)
Однако если учесть другие особенности мнезии, то ответ будет более сложным.
- Таблицы
local_content
. Если таблица являетсяlocal_content
таблицей, то она может иметь разное содержимое на каждом узле в кластере mnesia, поэтому емкость таблицы составляет4Gb * <number of nodes>
- фрагментированные таблицы. Mnesia поддерживает настраиваемое пользователем разбиение таблицы на разделы или сегментирование с использованием фрагментов таблиц. В этом случае вы можете эффективно распределить и перераспределить данные в вашей таблице по ряду примитивных таблиц. Каждая из этих примитивных таблиц может иметь свою собственную конфигурацию - скажем, одна таблица ram_copies и остальные таблицы disk_only_copies. Эти примитивные таблицы имеют такие же ограничения размера, как упоминалось ранее, и теперь эффективная емкость фрагментированной таблицы составляет
4Gb * <number of fragments>
. (К сожалению, если вы фрагментируете свою таблицу, вам придется изменить код доступа к таблице, чтобы использоватьmnesia:activity/4
вместоmnesia:write
и друзей, но если вы спланируете это заранее, это управляемо) - внешние копии Если вам нравится жить на переднем крае, вы можете применить mnesiaex исправляет mnesia и сохраняет данные вашей таблицы во внешней системе, например Amazon S3 или Tokyo Cabinet. В этом случае емкость таблицы ограничена внутренним хранилищем.
TL; DR: емкость хранилища базы данных Mnesia ограничена только * доступной оперативной памятью.
* Предполагая, что вы используете типы таблиц ram_copies
или disc_copies
. Кроме того, если вы храните много данных в disc_copies
таблице, они должны быть прочитаны с диска при запуске, что может увеличить время запуска сверх допустимого.
Этот ответ противоречит двум существующим ответам, когда речь идет о таблицах типа disc_copies
. Позвольте мне сначала выделить несколько общих моментов:
- Таблица мнезии типа
ram_copies
ограничена только доступной оперативной памятью (за исключением 32-битной машины). Данные хранятся в таблице ETS. - Таблица мнезии типа
disc_only_copies
хранится в таблице Dets. Таблицы Dets ограничены 2 ГБ из-за ограничений в формате файла. - Очевидный способ обойти это ограничение - создать больше таблиц, возможно, с помощью фрагментации таблиц.
- Схема также хранится в таблице Dets, поэтому информация, описывающая все существующие таблицы, также ограничена 2 ГБ. Однако вы, скорее всего, столкнетесь с другими ограничениями, прежде чем достигнете этого.
- Таблица мнезии типа
disc_copies
хранится и в ОЗУ и на диске, поэтому она ограничена доступной ОЗУ - и, возможно, чем-то еще?
Ниже я попытаюсь показать, что Mnesia не устанавливает никаких ограничений на размер disc_copies
таблицы. Однако обратите внимание, что многие программисты на Erlang считают, что disc_copies
таблиц ограничены 2 ГБ. Об этом говорится в принятом ответе на этот вопрос, который на момент написания статьи превосходит этот ответ в 7 раз.
disc_copies перемещен из dets в disk_log в 2001 г.
Обычно считается, что disc_copies
таблиц поддерживаются таблицами Dets. Насколько я могу судить, так было до Erlang / OTP R7B-4 (выпущенного 30 сентября 2001 г.). Из README:
-- mnesia -----------------------------------------------------------------
OTP-3712 - Speed/load improvements disc_copies tables are not
implemented with dets anymore.
См. для более подробной информации, а также более подробную информацию. mnesia_loader.erl
.
Источники с поддержкой dets и лимитом 2/4 ГБ
ответ Архелая взят из http://erlang.org/~hakan/mnesia_consuming.txt, в котором объясняется, что disc_copies
таблицы находятся в таблицах ets и dets. Однако, глядя на индекс каталога, мы видим, что этот документ датирован 1999 годом:
[TXT] mnesia_consumption.txt 26-Oct-1999 10:57 10k
В этом есть смысл, потому что это было написано за два года до изменений.
Ответ Рэя Бусена взят из FAQ по Erlang:
11.5 Сколько данных можно хранить в Mnesia?
Dets использует 32-битные целые числа для смещения файлов, поэтому максимально возможная таблица мнезии (на данный момент) составляет 4 Гб.
На практике ваша машина замедлится до ползания, прежде чем вы достигнете этого предела.
В FAQ говорится, что по крайней мере с января 2001 г. (см. самая ранняя копия на Wayback Machine). Это означает, что эта запись в FAQ датируется до перехода на disk_log и долгое время не обновлялась. (В любом случае ограничение на размер таблицы Dets составляет 2 ГБ, а не 4 ГБ.) Я отправил a запрос на вытягивание для FAQ.
Источники, поддерживающие более высокие лимиты
В главе Learn You Some Erlang о Mnesia говорится:
ram_copies
Эта опция позволяет сохранять все данные исключительно в ETS, то есть только в памяти. Память должна быть ограничена теоретическим значением 4 ГБ (а практически около 3 ГБ) для виртуальных машин, скомпилированных на 32-битной основе, но этот предел сдвигается дальше на 64-битных виртуальных машинах при условии, что доступно более 4 ГБ памяти.disc_only_copies
Этот параметр означает, что данные хранятся только в DETS. Только диск, поэтому объем хранилища ограничен 2 ГБ для DETS.disc_copies
Этот параметр означает, что данные хранятся как в ETS, так и на диске, то есть как в памяти, так и на жестком диске. Таблицы disc_copies не ограничены лимитами DETS, так как Mnesia использует сложную систему журналов транзакций и контрольных точек, которые позволяют создавать резервные копии таблицы на диске в памяти.
Я не уверен, когда это было написано, но приведенный выше текст существует в самая ранняя копия Wayback Machine, датированная апрелем 2012 года.
В сообщении об эрланговых вопросах под названием «забить Мнезию до смерти (было RE : Использование 4 Гб оперативной памяти с Erlang VM) " от 7 ноября 2005 г. Ульф Вигер пишет:
На машине с 16 ГБ вы можете:
запускать 6 миллионов одновременных процессов (с помощью erlang: hibernate я фактически смог запустить 20 миллионов - время создания: 6,3 мкс, время передачи сообщения: 5,3 мкс, и у меня было 1,8 ГБ в запасе).
заполните мнезию как минимум 12 ГБ данных, но подумайте, как вы хотите их представить, поскольку 64-битный размер слова немного взрывает ситуацию.
ведите таблицу disk_copy размером 10 ГБ в mnesia. Время загрузки и стоимость дампа журнала кажутся приемлемыми (загрузка 10 минут, сброс занимает некоторое время, но довольно хорошо работает в фоновом режиме).
Выводы
Путаница, похоже, связана с отсутствующей или устаревшей информацией из официальных источников:
- В документации Mnesia не упоминаются ограничения на размер таблицы.
- В часто задаваемых вопросах Erlang говорится, что Mnesia подлежит ограничению на размер Dets 4 ГБ, но этот ответ был написан до изменения dets на disk_log
- Единственный другой документ в домене erlang.org - это документ Хокана Маттссона, созданный до изменения dets на disk_log.
LYSE кажется первым «авторитетным» источником, в котором упоминается disc_copies
таблиц, не подпадающих под ограничение размера таблицы Dets.
Согласно документации, это 4 ГБ. Раздел 11.5
http://erlang.org/faq/mnesia.html