2013-12-09 3 views
2

Я работаю над проектом с использованием STXXL, который, как я понимаю, является базовой версией библиотеки STL C++. В настоящее время моя программа работает нормально, но проблема, с которой я столкнулся сейчас, заключается в том, что при запуске программы она использует около 2 ГБ памяти (с набором данных с низким и средним размером).Высокое использование памяти с помощью STXXL

В моей программе я использую 25 векторов STXXL, хранящихся в отдельных файлах на диске. Что касается моего .stxxl-файла, я в настоящее время настроен на динамическое распределение файла диска (путем установки размера диска на 0).

Итак, мой вопрос: есть ли способ явно использовать STXXL для использования жесткого диска в отличие от ОЗУ? Или можно ли использовать этот объем памяти при использовании этой библиотеки?

Заранее благодарим за любой совет, который может предоставить.

ответ

3

Что bobb_the_builder говорит об использовании оперативной памяти в stxxl: вектор является правильным.

Смотрите следующий код:

#include <stxxl/vector> 

int main() 
{ 
    // create vector 
    //stxxl::VECTOR_GENERATOR<int>::result vector[25]; 
    stxxl::VECTOR_GENERATOR<int, 1, 1, 1*1024*1024>::result vector[25]; 

    // fill vectors with integers 
    for (size_t i = 0; i < 100 * 1024 * 1024 * 1024llu; ++i) { 
     vector[i % 25].push_back(i); 
    } 

    return 0; 
} 

В Linux, резидент размер памяти программы растет до 27528 KiB при использовании и около 1,6 ГиБ при использовании которой является.

Означает ли диспетчер Windows то же самое? Возможно, это ошибка STXXL только в Windows, или просто диспетчер задач показывает разные размеры памяти?

+0

Спасибо за пример Тимо! В конце концов, я сделал новое решение с этими принципами в виду, и я смог получить использование памяти до очень разумного 50 МБ на вектор, используя минимальный конструктор, например: vector (1000000); '. Спасибо за вашу помощь! – Andrewziac

2

Я думаю, вы используете шаблон STXXL::VECTOR_GENERATOR, чтобы создать 25 stxxl::vector вы упомянули в своем размещении? Использование внутренней памяти stxxl::vector в целом зависит от вашей индивидуальной конфигурации (то есть block_size * page_size * cache_pages), как описано в STXXL documentation on STXXL::VECTOR_GENERATOR. Все вместе суммируется в резервном внутреннем (= основном) объеме памяти. Насколько я знаю, STXXL пытается выделить столько внутренней памяти, сколько ваши контейнеры используют (если возможно) в качестве кешей в зависимости от этих параметров шаблона.

Примечание: по умолчанию значения для указанных выше параметров шаблона являются:

page_size = 4 
cache_pages = 8 
block_size = 2 MiB 

что приводит к общему потреблению памяти 25 * (2 Мб * 4 * 8) = 1600 МИБ что объясняет огромную часть вашего сообщения о потреблении памяти в 2 ГБ.

(Примечание: Какой тип_данных (ValueType) сохраняются в вашем векторе STXXL не имеет значения.)

+0

Спасибо за информацию! Я искал различные значения, о которых вы упоминали, и это меня немного больше, но теперь я вижу, что, поскольку моя программа добавляет все больше элементов в мои векторы, использование памяти (как показано в диспетчере задач Windows) начинают очень быстро расти с ним (до 2 ГБ, как упоминалось ранее). Я чувствую, что это просто хранение всего вектора в памяти вместо использования жесткого диска. Возможно, я должен был упомянуть об этом раньше, но мои векторы должны быть глобальными, и они должны сохраняться на протяжении всего цикла программы, будет ли это причиной этого? – Andrewziac

+0

Насколько высока ваша основная потребляемая память, если вы устанавливаете page_size = 1, cache_size = 1 и block_size = 1 * 1024 * 1024 (1 MiB)? Как вы предопределяете и запускаете эти stxxl :: векторы? –

+0

Как вы предопределяете и запускаете эти stxxl :: векторы?Я предполагаю, что вы не нажимаете достаточные значения push_back в векторы, чтобы их кеширование переполнений и элементы должны храниться по блокам на ваших дисках. Вставьте много гигабайт значений и проверьте, превышает ли ваше потребление памяти 2 ГБ. –

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