Mmap против статического выделения для больших выделений

Я выделяю довольно большой, примерно 100 ГБ, кусок памяти. Точный размер всегда известен во время компиляции.

Должен ли я распределять статически?

static char data[DATA_SIZE];

Или используя mmap?

data = mmap(NULL, DATA_SIZE, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE|MAP_LOCKED|MAP_UNINITIALIZED, -1, 0)

В первом случае приложение (без учета времени запуска) работает незначительно быстрее.

Игнорируя неудачные распределения, каковы плюсы и минусы каждого подхода?

2 ответа

Там нет никакой причины, чтобы использовать mmap за это; malloc вполне способен сделать это, и будет нормально использовать mmap в любом случае, но с помощью malloc делает ваш код проще, легче для понимания и более переносимым.

Что касается того, является ли статический массив предпочтительным, возможно. Основным недостатком является то, что он заставляет вас иметь фактический синглтон (что плохо) вместо того, чтобы иметь один экземпляр структуры данных, который может, даже если вам это не нужно, существовать в более чем одном экземпляре. Еще один аспект использования статического массива, который может быть за или против, в зависимости от вашей перспективы, заключается в том, что он переносит случай сбоя из того, что вы должны обработать во время выполнения, в то, что должен обработать вызывающий вашу программу (из-за сбоя execve или досрочное прекращение процесса до того, как контроль достигнет вашего процесса).

Я хотел бы использовать mmap или же mallocпросто потому, что случай сбоя легче обрабатывать (и вы могли бы по крайней мере дать значимое сообщение об ошибке). Со статическими данными execve(2) вашей программы потерпит неудачу (и оболочка, пробующая это, выдаст не очень полезное сообщение).

Тем не менее, я бы также, возможно, проверить (может быть, путем анализа /proc/meminfo) что базовая система имеет достаточно ресурсов памяти.

Наконец, не зная, зачем вам нужно так много данных, пахнет довольно плохо. Вы уверены, что не можете поступить иначе? Если вам действительно нужно 100 Гбайт, вы можете работать только на очень больших (и дорогих) машинах.

Не ожидайте, что подсистема виртуальной памяти справится с этим с помощью подкачки страниц. Сокрушительный удар был бы настолько важен, чтобы сделать компьютер непригодным для использования. Или подумайте об использовании madvise (2).

Если у вас нет доступа к специализированному суперкомпьютеру, это выглядит как ошибка проектирования (современные настольные ПК имеют не более 32 Гбайт).

Другие вопросы по тегам