Это соображение общего C++, или что-то мне нужно обратиться на уровне OpenCV?
Вы просто выделяете и используете лодку памяти. Весь смысл пейджинга/виртуальной памяти в том, что он полностью прозрачен. Все получает чрезвычайно медленно, но продолжает работать. Вы не получаете ENOMEM
, пока не выходите из пространства подкачки + ОЗУ.
В нормальной системе Linux, ваш обычный раздел подкачки должен быть очень небольшим (до 1 Гб), так что вам, вероятно, нужно dd
файл подкачки, и mkswap
/swapon
на нем. Убедитесь, что файл подкачки имеет разрешение на чтение и запись только для root. Очевидно, что каждая крупная ОС будет иметь свои собственные процедуры.
Это так же просто, как сделать зернистость данных близкими (но не более) 4 КБ? (см. решение здесь для мотивации 4 КБ)
Если у вас есть указатели на другие данные, убедитесь, что вы держите их вместе. Вы хотите, чтобы все маленькие «горячие» данные находились всего на нескольких страницах, которые не могут выдать достойный алгоритм OS LRU.
Если у вас есть горячие данные, смешанные с холодными данными, он легко выгрузится и приведет к дополнительному обращению с файлами в обе стороны, прежде чем пропустить кеш для окончательных данных может даже произойти.
Как и в случае с Yakk, последовательные шаблоны доступа будут намного лучше, поскольку дисковый ввод-вывод улучшает работу с многоблочными чтениями. (Даже SSD имеют лучшую пропускную способность с большими блоками). Это также позволяет выполнить предварительную выборку, которая позволяет одному запросу ввода-вывода начинаться до того, как будут получены данные предыдущего. Максимальная пропускная способность ввода-вывода требует запросов конвейерной обработки.
Попробуйте разработать алгоритмы для последовательного доступа, когда это возможно. Это выгодно на всех уровнях памяти, от пейджинга вплоть до кеша L1. Последовательный доступ даже позволяет авто-векторизация с векторными реестрами.
Cache blocking (aka loop tiling) техники также применимы к промахам страницы. Google, но основная идея - сделать все шаги вашего алгоритма над подмножеством данных, а не касаться всех данных на каждом шаге. Затем каждый фрагмент данных должен быть загружен только в кеш, а не один раз для каждого шага вашего алгоритма.
Думайте о DRAM как кэш для своего гигантского виртуального адресного пространства.
Как бы мат (ы) на самом деле быть сохранены, доступны и представлены на диске? (именно так используется отображение памяти?)
Swap space/the pagefile is the backing store for your process's address space. Так что да, это очень похоже на то, что вы получили бы, если бы вы выделили память на mmap
ing вместо того, чтобы сделать анонимное выделение.
Если вы можете управлять шаблонами доступа, например, читать 1 мб линейного адресного пространства от начала до конца, ОС будет очень хорошо предсказывать то, что вы хотите прочитать далее, и прочитать его для вас впереди. Но на самом деле, мимо определенного момента, вы будете ограничены диском io (если вы не используете сумасшедшее быстрое хранилище); поэтому ваша цель на этом лимите состоит в том, чтобы избегать чтения вещей более одного раза (ну, чтобы перестать читать его после бит, чтобы избежать обмолота). В принципе, попробуйте отступить от произвола. Любые улучшения там могут доминировать над чем-либо еще, что вы можете сделать. – Yakk
@Yakk, «избегайте чтения вещей более одного раза»: вот что работает LRU/LFU-кеш для управления - как я понимаю, такая функциональность подразумевается в алгоритмах управления памятью. –