2016-04-19 4 views
4

Я хотел бы знать, как оптимизировать структуры данных в openCV (конкретно тип мата), чтобы я мог использовать операционные системы, созданные в памяти/виртуальной памяти управление.Оптимизация структуры данных для использования виртуальной памяти

Для полного контекста ознакомьтесь, пожалуйста, с Q и A here - но в противном случае ситуация может быть суммированы, что у меня есть большая коллекция ковриков *, что мне нужно получить доступ к произвольно и быстро. Главным осложнением является то, что полный объем данных значительно превышает объем доступной оперативной памяти.

(* Концептуально данные рекурсивно определяется 3D массив 3D массивов, но давайте не мутить воду с этой путанице!)

Вместо того, чтобы построить свой собственный кэш LRU и RAM-голодны и неэффективные стратегии «страницы» для доступа к нему, я бы предпочел, чтобы ОС сделала это для меня.

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

  • Это общий C++ рассмотрение, или что-то мне нужно обратиться на уровне OpenCV?

  • Это так же просто, как сделать зернистость данных близкими (но не более) 4 КБ? (см. решение here для мотивации 4 КБ)

  • Как бы на самом деле (-ах) (-ах) (-ах) (-ах) были сохранены, доступны и представлены на диске? (В этом, как memory-mapping участвует?)
+2

Если вы можете управлять шаблонами доступа, например, читать 1 мб линейного адресного пространства от начала до конца, ОС будет очень хорошо предсказывать то, что вы хотите прочитать далее, и прочитать его для вас впереди. Но на самом деле, мимо определенного момента, вы будете ограничены диском io (если вы не используете сумасшедшее быстрое хранилище); поэтому ваша цель на этом лимите состоит в том, чтобы избегать чтения вещей более одного раза (ну, чтобы перестать читать его после бит, чтобы избежать обмолота). В принципе, попробуйте отступить от произвола. Любые улучшения там могут доминировать над чем-либо еще, что вы можете сделать. – Yakk

+0

@Yakk, «избегайте чтения вещей более одного раза»: вот что работает LRU/LFU-кеш для управления - как я понимаю, такая функциональность подразумевается в алгоритмах управления памятью. –

ответ

1

Это соображение общего 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. Так что да, это очень похоже на то, что вы получили бы, если бы вы выделили память на mmaping вместо того, чтобы сделать анонимное выделение.

Смежные вопросы