Сегодня я столкнулся с проблемой, что доступ к векторным элементам замедлялся из-за размера вектора. Поскольку это не мой код, я не могу его опубликовать, поэтому, пожалуйста, потерпите меня. Я постараюсь описать его максимально подробно.
Функциональность кода следующая: 1. Класс набора данных принимает файл .txt, который содержит имена файлов. Они указывают на стандартные png-изображения, которые необходимо загрузить. Это делается классом Image<T>
. Изображения загружаются как Image<unsigned char>
и помещаются обратно в std::Vector
. 2. После завершения загрузки данных. Я могу получить доступ к вектору в своем наборе данных, чтобы работать с ним. Итак, это выглядит примерно так:
Dataset d;
d.init("filenames_list.txt"); //Loads the images
for(int i=0; i< d.getDatavector().size(); i++){
Image<unsigned char> current = d.getDatavector()[i];
//Do work on current image here.
}
Здесь getDatavector() вернет std::Vector<Image<unsigned char> >
. Изображения содержат три целых числа для ширины, высоты и количества каналов, а также общий указатель Boost, который указывает на чередующиеся данные.
Для небольших тестов у меня есть список файлов, который содержит около 150 изображений. Запуск программы с этим работает нормально, и измерения скорости говорят мне, что
Image<unsigned char> current = d.getDatavector()[i];
занимает около 10 мс. Однако, если я хочу работать с моим полным набором данных из 1500 изображений, выполнение приведенной выше строки займет около 500 мс. Я пытался сделать много разных вещей, чтобы исправить это, но я несколько ограничен общей структурой кода и памятью. Потому что, если я сделаю следующее:
const std::Vector<Image<unsigned char> > data = d.getDatavector();
перед циклом он работает очень быстро, но вскоре мне не хватает памяти.
Я знаю, что описание моей проблемы несколько расплывчато, и я не надеюсь на точное решение, но я надеюсь на некоторые советы о том, где искать. Я искал похожие проблемы, но людей, кажется, интересует только общая скорость векторов по сравнению с массивами. Моя проблема в том, что скорость ухудшается с длиной вектора! Если кто-то видел такую проблему, любые предложения очень приветствуются!
До сих пор я пытался получить доступ к содержимому, используя std::vector::iterator или используя (d.getDatavector().data()) в качестве указателя. Ничто, кажется, не улучшает его скорость.
getDatavector
возвращает ссылку? Или значение? - person Benjamin Lindley   schedule 15.11.2012unsigned short
в одном случае, аunsigned char
в другом? может быть, из-за этой разницы происходит какое-то преобразование между форматами изображений? Или это простая опечатка? - person didierc   schedule 15.11.2012