Использование памяти при использовании boost :: iostreams :: mapped_file
Я вставляю некоторый код, который использует boost iostream для mmap, а затем записывает в сопоставленный файл:
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();
}
Когда я выполнил это на моем Centos 6 Box с 8 процессорами и 16 ГБ оперативной памяти, я заметил следующее:
Когда данные вставлялись в файл отображения памяти, RES (из верхней команды) непрерывно увеличивался и достигал 14 ГБ. У меня сложилось впечатление, что когда я mmap файл VIRT увеличится, а не RES. Так что, когда мы записываем в файл mmap, сначала он записывается в память, а затем записывается на диск? Или какой-нибудь промежуточный буфер / кеш используется?
С помощью команды «free» я также заметил, что после того, как использование памяти достигает 16 ГБ, используются буферы. Вот несколько снимков свободной команды в разное время, когда выполнялся приведенный выше код:
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
Что означает это поведение?
Запись данных в отображенный в память файл заняла много времени по сравнению с записью в память. Что является причиной этого?
Я хотел использовать отображение памяти, чтобы снизить использование RES, поскольку я имею дело с огромными данными. Но, похоже, это не так. Хотелось сохранить все данные в отображенных в память файлах и при необходимости прочитать их обратно.
Я неправильно использую отображение памяти? Или так себя ведет?