Вопрос

В некоторых местах указывается период 2 ГБ.В некоторых местах говорится, что это зависит от количества узлов.

Это было полезно?

Решение

Довольно большой, если ваш вопрос: «Какова емкость базы данных mnesia, состоящей из огромного количества disc_only_copies table» — вы в значительной степени ограничены доступным дисковым пространством.

Более простой вопрос: какова максимальная емкость одной таблицы мнезии разных типов. ram_copies таблицы ограничены доступной памятью. disc_copies таблицы ограничены своими dets бэкэнд (Хакан Маттссон о Mnesia) - на данный момент этот лимит составляет 4Гб данных.

Итак, простой ответ настолько прост disc_copies table может хранить до 4 ГБ данных, прежде чем они столкнутся с проблемами.(Mnesia на самом деле не аварийно завершает работу, если вы превышаете ограничение размера на диске — часть таблицы ram_copies продолжает работать, поэтому вы можете исправить это, удалив данные или приняв другие меры во время выполнения.)

Однако если принять во внимание другие особенности мнезии, то ответ будет сложнее.

  • local_content столы.Если таблица local_content Таблица, тогда он может иметь различное содержимое на каждом узле в кластере Мнезии, поэтому емкость таблицы4Gb * <number of nodes>
  • фрагментированные таблицы.Mnesia поддерживает настраиваемое пользователем секционирование или сегментирование таблиц с использованием фрагментов таблиц.В этом случае вы можете эффективно распределять и перераспределять данные в вашей таблице по нескольким примитивным таблицам.Каждая из этих примитивных таблиц может иметь свою собственную конфигурацию — скажем, одну таблицу ram_copies, а остальные таблицы disk_only_copies.Эти примитивные таблицы имеют те же ограничения на размер, что упоминались ранее, и теперь эффективная емкость фрагментированной таблицы составляет 4Gb * <number of fragments>. (К сожалению, если вы фрагментируете свою таблицу, вам придется изменить код доступа к таблице, чтобы использовать mnesia:activity/4 вместо mnesia:write и друзья, но если спланировать это заранее, это осуществимо)
  • внешние копии Если вам нравится жить на передовой, вы можете применить мнесиаэкс патчи для mnesia и сохраняйте данные вашей таблицы во внешней системе, например Амазонка S3 или Токийский кабинет.В этом случае емкость таблицы ограничена внутренним хранилищем.

Другие советы

Этот ответ противоречит двум существующим ответам, когда речь идет о таблицах типа 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_lib.erl и mnesia_loader.erl.


Исходники, поддерживающие дет и ограничение 2/4 ГБ

ответ архелая черпает из http://erlang.org/~hakan/mnesia_consumption.txt, что объясняет, что disc_copies таблицы находятся в таблицах ets и dets.Однако, глядя на индекс каталога, мы видим, что этот документ датирован 1999 годом:

[TXT] mnesia_consumption.txt  26-Oct-1999 10:57    10k  

Это имеет смысл, поскольку это было написано за два года до изменения.

Ответ Рэя Бузена черпает из Часто задаваемые вопросы по Эрлангу:

11.5 Сколько данных можно хранить в Mnesia?

Dets использует 32-битные целые числа для смещения файлов, поэтому максимально возможный размер таблицы mnesia (на данный момент) составляет 4 ГБ.

На практике ваша машина замедлится до ползания, прежде чем вы достигнете этого предела.

В FAQ говорится, что по крайней мере с января 2001 г. (см. самая ранняя копия в Wayback Machine).Это означает, что эта запись FAQ датируется еще до перехода на disk_log и не обновлялась в течение длительного времени.(В любом случае, ограничение размера таблицы Dets составляет 2 ГБ, а не 4 ГБ.) Я отправил запрос на вытягивание для FAQ.


Источники, поддерживающие более высокие лимиты

Глава «Изучите Erlang» о Mnesia говорит:

ram_copies
Эта опция позволяет хранить все данные исключительно в ETS, то есть только в памяти.Память должна быть ограничена теоретически 4 ГБ (а практически около 3 ГБ) для виртуальных машин, скомпилированных на 32-битной версии, но этот предел еще больше расширяется на 64-битных виртуальных машинах, при условии, что доступно более 4 ГБ памяти.

disk_only_copies
Эта опция означает, что данные хранятся только в DETS.Только диск, поэтому объем хранилища ограничен лимитом DETS в 2 ГБ.

диски_копии
Этот вариант означает, что данные хранятся как в ETS, так и на диске, то есть как в памяти, так и на жестком диске.Таблицы disk_copies не ограничены ограничениями DETS, поскольку Mnesia использует сложную систему журналов транзакций и контрольных точек, которые позволяют создавать в памяти дисковую резервную копию таблицы.

Я не уверен, когда это было написано, но текст выше существует в самая ранняя копия Wayback Machine, от апреля 2012 года.

В пост на erlang-вопросах под заголовком «избить mnesia до смерти» (было RE:Использование 4 ГБ оперативной памяти с Erlang VM)", от 7 ноября 2005 г., Ульф Вигер пишет:

На машине с памятью 16 ГБ вы можете:

  • Запустите 6 миллионов одновременных процессов (благодаря использованию Erlang: Hibernate, я действительно смог запустить 20 миллионов - время SPAWN:6.3 США, время передачи сообщений:5.3 США, и у меня было 1,8 ГБ.

  • Заполняйте Мнезии как минимум 12 ГБ данных, но продумайте, как вы хотите ее представить, так как 64-битный размер слова немного раздувает ситуацию.

  • сохраните таблицу disk_copy размером более 10 ГБ в mnesia.Время нагрузки и стоимость дампа в журнале кажутся приемлемыми (10 минут для загрузки, сброс занимает некоторое время, но довольно хорошо работает на заднем плане.)

Выводы

Судя по всему, путаница возникает из-за отсутствия или устаревшей информации из официальных источников:

  • В документации Mnesia не упоминаются ограничения на размер таблицы.
  • В FAQ по 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top