Saltar al contenido

¿Cuál es la capacidad de almacenamiento de una base de datos Mnesia?

Este equipo redactor ha estado por horas investigando para darle espuestas a tus interrogantes, te ofrecemos la respuestas de modo que nuestro deseo es que te resulte de gran ayuda.

Solución:

Bastante grande si su pregunta es “¿cuál es la capacidad de almacenamiento de una base de datos de mnesia compuesta por una gran cantidad de disc_only_copies tablas “: está muy limitado por el espacio disponible en disco.

Una pregunta más fácil de responder es cuál es la capacidad máxima de una sola mesa de mnesia de diferentes tipos. ram_copies las tablas están limitadas por la memoria disponible. disc_copies las tablas están limitadas por su dets backend (Hakan Mattsson en Mnesia): este límite es de 4Gb de datos en este momento.

Entonces la respuesta simple es así de simple disc_copies La mesa puede almacenar hasta 4 Gb de datos antes de que surjan problemas. (Mnesia en realidad no se bloquea si excede el límite de tamaño en el disco: la parte ram_copies de la tabla continúa ejecutándose, por lo que puede reparar esto eliminando datos o haciendo otros arreglos en tiempo de ejecución)

Sin embargo, si considera otras características de la mnesia, la respuesta es más complicada.

  • local_content mesas. Si la mesa es un local_content tabla, entonces puede tener diferentes contenidos en cada nodo en el clúster de mnesia, por lo que la capacidad de la tabla es
    4Gb *
  • tablas fragmentadas. Mnesia admite particiones o particiones de tablas configurables por el usuario mediante fragmentos de tablas. En este caso, puede distribuir y redistribuir eficazmente los datos de su tabla en varias tablas primitivas. Cada una de estas tablas primitivas puede tener su propia configuración, digamos una tabla ram_copies y el resto de tablas disc_only_copies. Estas tablas primitivas tienen los mismos límites de tamaño que se mencionan anteriormente y ahora la capacidad efectiva de la tabla fragmentada es 4Gb * . (Lamentablemente, si fragmenta su tabla, debe modificar su código de acceso a la mesa para usar mnesia:activity/4 en lugar de mnesia:write y amigos, pero si lo planeas con anticipación, es posible)
  • copias externas Si le gusta vivir en la vanguardia extrema, puede aplicar los parches mnesiaex a mnesia y almacenar los datos de su tabla en un sistema externo como Amazon S3 o Tokyo Cabinet. En este caso, la capacidad de la tabla está limitada por el almacenamiento de backend.

TL; DR: la capacidad de almacenamiento de una base de datos de Mnesia es limitada únicamente* por RAM disponible.

* Suponiendo que usa tipos de tablas ram_copies o disc_copies. Además, si almacena muchos datos en un disc_copies tabla, debe leerse desde el disco al inicio, lo que podría aumentar el tiempo de inicio más allá de lo aceptable.


Esta respuesta contradice las dos respuestas existentes cuando se trata de tablas de tipo disc_copies. Permítanme primero aclarar algunos puntos generales:

  • Una tabla de mnesia de tipo ram_copies solo está limitado por la RAM disponible (excepto si está en una máquina de 32 bits). Los datos se almacenan en una tabla ETS.
  • Una tabla de mnesia de tipo disc_only_copies se almacena en una tabla Dets. Las tablas Dets están limitadas a 2 GB debido a los límites en el formato de archivo.
  • La forma obvia de eludir ese límite es crear más tablas, posiblemente mediante la fragmentación de tablas.
  • El esquema también se almacena en una tabla Dets, por lo que la información que describe todas las tablas existentes también se limita a 2 GB. Sin embargo, es probable que se encuentre con otros límites antes de alcanzar ese.
  • Una tabla de mnesia de tipo disc_copies está almacenado ambos en RAM y en disco, por lo que está limitado por la RAM disponible, ¿y quizás algo más?

Voy a intentar mostrar a continuación que hay no límite específico impuesto por Mnesia sobre el tamaño de un disc_copies mesa. Sin embargo, tenga en cuenta que muchos programadores de Erlang creen que disc_copies las tablas están limitadas a 2 GB. Eso se indica en la respuesta aceptada a esta pregunta, que en el momento de escribir este artículo supera esta respuesta por un factor de 7.


disc_copies se trasladó de dets a disk_log en 2001

Comúnmente se cree que disc_copies las tablas están respaldadas por tablas Dets. Por lo que puedo decir, este fue el caso hasta Erlang / OTP R7B-4 (lanzado el 30 de septiembre de 2001). Del README:

  -- mnesia -----------------------------------------------------------------

        OTP-3712 - Speed/load improvements disc_copies tables are not 
                   implemented with dets anymore.

Mire la diferencia para obtener más detalles, en particular mnesia_lib.erl y mnesia_loader.erl.


Fuentes que apoyan dets y un límite de 2/4 GB

La respuesta de Archelaus se basa en http://erlang.org/~hakan/mnesia_consumption.txt, que explica que disc_copies las tablas residen en tablas ets y dets. Sin embargo, mirando el índice del directorio, vemos que este documento está fechado en 1999:

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

Tiene sentido que diga esto, ya que fue escrito dos años antes del cambio.

La respuesta de Ray Boosen se basa en las preguntas frecuentes de Erlang:

11.5 ¿Cuántos datos se pueden almacenar en Mnesia?

Dets usa enteros de 32 bits para las compensaciones de archivos, por lo que la tabla mnesia más grande posible (por ahora) es 4Gb.

En la práctica, su máquina reducirá la velocidad a un ritmo lento antes de alcanzar este límite.

Las preguntas frecuentes han estado diciendo eso desde al menos enero de 2001 (ver la primera copia en Wayback Machine). Eso significa que esta entrada de preguntas frecuentes data de antes del cambio a disk_log y no se ha actualizado durante mucho tiempo. (De todos modos, el límite de tamaño de la tabla Dets es de 2 GB, no de 4 GB). Envié una solicitud de extracción para las preguntas frecuentes.


Fuentes que apoyan límites más altos

El capítulo Learn You Some Erlang sobre Mnesia dice:

ram_copies

Esta opción hace que todos los datos se almacenen exclusivamente en ETS, por lo tanto, solo en la memoria. La memoria debería limitarse a 4 GB teóricos (y prácticamente alrededor de 3 GB) para las máquinas virtuales compiladas en 32 bits, pero este límite se aleja más en las máquinas virtuales de 64 bits, asumiendo que hay más de 4 GB de memoria disponible.

disc_only_copies

Esta opción significa que los datos se almacenan solo en DETS. Solo disco y, como tal, el almacenamiento está limitado al límite de 2 GB de DETS.

disc_copies

Esta opción significa que los datos se almacenan tanto en ETS como en el disco, tanto en la memoria como en el disco duro. Las tablas disc_copies no están limitadas por los límites de DETS, ya que Mnesia utiliza un complejo sistema de registros de transacciones y puntos de control que permiten crear una copia de seguridad en disco de la tabla en la memoria.

No estoy seguro de cuándo se escribió esto, pero el texto anterior existe en la copia más antigua de Wayback Machine, con fecha de abril de 2012.

En una publicación sobre erlang-questions titulada “golpeando a mnesia hasta la muerte (era RE: Using 4Gb of ram with Erlang VM)”, con fecha del 7 de noviembre de 2005, Ulf Wiger escribe:

En una máquina de 16 GB, puede:

  • ejecutar 6 millones de procesos simultáneos (mediante el uso de erlang: hibernate, en realidad pude ejecutar 20 millones – tiempo de generación: 6.3 us, tiempo de paso del mensaje: 5.3 us, y tenía 1.8 GB de sobra).

  • rellene mnesia con al menos 12 GB de datos, pero piense cómo quiere representarlo, ya que el tamaño de la palabra de 64 bits hace que las cosas exploten un poco.

  • mantener una tabla de copia de disco de más de 10 GB en mnesia. Los tiempos de carga y el costo de volcado de registros parecen aceptables (10 minutos para cargar, el volcado lleva un tiempo pero se ejecuta en segundo plano bastante bien).

Conclusiones

La confusión parece provenir de información faltante o desactualizada de fuentes oficiales:

  • La documentación de Mnesia no menciona ningún límite de tamaño de tabla.
  • Las preguntas frecuentes de Erlang dicen que Mnesia está sujeta a un límite de tamaño de Dets de 4 GB, pero esta respuesta se escribió antes de que los dets to disk_log cambiaran
  • El único otro documento en el dominio erlang.org es el documento de Håkan Mattsson, que data de antes del cambio dets a disk_log

LYSE parece ser la primera fuente “autorizada” que menciona disc_copies las mesas no están sujetas al límite de tamaño de mesa de Dets.

Según la documentación, esto es 4GB. Sección 11.5

http://erlang.org/faq/mnesia.html

Reseñas y puntuaciones

Agradecemos que quieras proteger nuestro estudio añadiendo un comentario y puntuándolo te damos la bienvenida.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *