Uso de memoria cuando se usa boost :: iostreams :: mapped_file

Estoy pegando un código aquí que usa boost iostream para mmap y luego escribe en el archivo asignado:

typedef unordered_map<int, string> work;

    int main()
    {

            work d;
            d[0] = "a";

            boost::iostreams::mapped_file_params  params;
            params.path = "map.dat";
            params.new_file_size = 1000000000;
            params.mode = (std::ios_base::out | std::ios_base::in);
            boost::iostreams::mapped_file  mf;
            mf.open(params);
            work* w = static_cast<work*>((void*)mf.data());
            w[0] = d;
            for(int i=1; i <1000000000 ;++i)
            {
                    w->insert(std::make_pair(i, "abcdef"));
            }
            mf.close();

    }

Cuando ejecuté esto en mi caja centos 6 con 8 procesadores y 16 GB de RAM, observé lo siguiente:

Cuando los datos se insertaban en el archivo mapeado de memoria, RES (desde el comando superior) aumentaba continuamente y alcanzaba hasta 14 GB. Tenía la impresión de que cuando mapeo un archivo VIRT aumentará y no RES. Entonces, ¿es que cuando escribimos en el archivo mmap, primero se escribe en la memoria y luego se guarda en el disco? ¿O hay algún buffer intermedio / caché utilizado?

Con la ayuda del comando "gratis", también observé que después de que el uso de la memoria alcanza los 16 GB, se usan los buffers. Aquí hay algunas instantáneas de comando libre en diferentes momentos cuando se estaba ejecutando el código anterior:

            total       used       free     shared    buffers     cached
Mem:      16334688   10530380    5804308          0     232576    9205532
-/+ buffers/cache:    1092272   15242416
Swap:     18579448     348020   18231428

            total       used       free     shared    buffers     cached
Mem:      16334688   13594208    2740480          0     232608    9205800
-/+ buffers/cache:    4155800   12178888
Swap:     18579448     348020   18231428

            total       used       free     shared    buffers     cached
Mem:      16334688   15385944     948744          0     232648    9205808
-/+ buffers/cache:    5947488   10387200
Swap:     18579448     348020   18231428

            total       used       free     shared    buffers     cached
Mem:      16334688   16160368     174320          0     204940    4049224
-/+ buffers/cache:   11906204    4428484
Swap:     18579448     338092   18241356

            total       used       free     shared    buffers     cached
Mem:      16334688   16155160     179528          0     141584    2397820
-/+ buffers/cache:   13615756    2718932
Swap:     18579448     338092   18241356

            total       used       free     shared    buffers     cached
Mem:      16334688   16195960     138728          0       5440      17556
-/+ buffers/cache:   16172964     161724
Swap:     18579448     572052   18007396

¿Qué significa este comportamiento?

Tomó mucho tiempo escribir datos en un archivo mapeado en memoria en comparación con escribir en la memoria. ¿Cuál es la razón para esto?

Quería usar el mapeo de memoria para reducir el uso de RES mientras trato con grandes datos. Pero no parece funcionar de esa manera. Quería mantener todos los datos en los archivos de memoria asignados y volver a leerlos cuando fuera necesario.

¿Estoy usando la asignación de memoria de forma incorrecta? ¿O esa es la forma en que se comporta?

Respuestas a la pregunta(1)

Su respuesta a la pregunta