Мне нужно добавить большое количество элементов в вектор stxxl. Каков наиболее эффективный способ добавления элементов в вектор stxxl? Прямо сейчас я использую push_back вектора stxxl, но это не очень эффективно. Это далеко от насыщения пропускной способности диска. Есть ли способ лучше?
Спасибо,
Da
Большинство вещей, написанных о «Эффективное последовательное чтение и запись в векторы» применить в вашем случае.
Помимо vector_bufwriter, который заполняет вектор с помощью императивного цикла, есть также вариант stxxl :: stream :: materialize (), который делает это в стиле функционального программирования.
О предварительном знании размера вектора: это на самом деле не нужно для EM, так как можно распределять блоки на лету. Тогда они, как правило, не будут в порядке, но так и будет, в любом случае на это нет никаких гарантий.
Я вижу, что кто-то (я) сделал vector_bufwriter автоматически двойной размер вектора, если заливка достигает конца вектора. На данный момент я не думаю, что это необходимо, возможно, следует изменить это поведение.
В соответствии с документация:
Если нужно только последовательно записать элементы в вектор в
n/B
I / O самый быстрый в настоящее время метод stxxl :: генерировать.
Не совсем отвечает, почему push_back
должен быть I / O-неэффективным, хотя.
Один подход:
Первый reserve
количество элементов вам нужно. Изменение размера вектора с некоторыми типами может занять очень много времени. Добавление многих элементов может привести к нескольким изменениям размера по мере роста вектора.
После изменения размера добавьте, используя emplace_back
(или просто нажмите, если тип тривиален, например, int
).
Также рассмотрите функции участника. Реализация, которая хорошо соответствует вашим потребностям, может уже существовать.