Как эффективно добавить большое количество элементов в вектор stxxl?

Мне нужно добавить большое количество элементов в вектор stxxl. Каков наиболее эффективный способ добавления элементов в вектор stxxl? Прямо сейчас я использую push_back вектора stxxl, но это не очень эффективно. Это далеко от насыщения пропускной способности диска. Есть ли способ лучше?

Спасибо,
Da

2

Решение

Большинство вещей, написанных о «Эффективное последовательное чтение и запись в векторы» применить в вашем случае.

Помимо vector_bufwriter, который заполняет вектор с помощью императивного цикла, есть также вариант stxxl :: stream :: materialize (), который делает это в стиле функционального программирования.

О предварительном знании размера вектора: это на самом деле не нужно для EM, так как можно распределять блоки на лету. Тогда они, как правило, не будут в порядке, но так и будет, в любом случае на это нет никаких гарантий.

Я вижу, что кто-то (я) сделал vector_bufwriter автоматически двойной размер вектора, если заливка достигает конца вектора. На данный момент я не думаю, что это необходимо, возможно, следует изменить это поведение.

2

Другие решения

В соответствии с документация:

Если нужно только последовательно записать элементы в вектор в n/B I / O самый быстрый в настоящее время метод stxxl :: генерировать.

Не совсем отвечает, почему push_back должен быть I / O-неэффективным, хотя.

0

Один подход:

  • Первый reserve количество элементов вам нужно. Изменение размера вектора с некоторыми типами может занять очень много времени. Добавление многих элементов может привести к нескольким изменениям размера по мере роста вектора.

  • После изменения размера добавьте, используя emplace_back (или просто нажмите, если тип тривиален, например, int).

Также рассмотрите функции участника. Реализация, которая хорошо соответствует вашим потребностям, может уже существовать.

0
По вопросам рекламы [email protected]