2

我正在使用 STXXL 开发一个项目,据我所知,它是 C++ STL 库的核心版本。目前,我的程序运行良好,但我现在面临的问题是,当程序运行时,它使用了接近 2GB 的内存(具有中低数据集)。

在我的程序中,我使用了 25 个 STXXL 向量,存储在磁盘上的单个文件中。至于我的 .stxxl 文件,我目前将其设置为动态分配磁盘文件(通过将磁盘大小设置为 0)。

所以,我的问题是:有没有办法明确地让 STXXL 使用硬盘而不是 RAM?或者在使用这个库时,这个内存使用量是预期的吗?

提前感谢任何人可以提供的任何建议。

4

2 回答 2

3

bobb_the_builder 关于 stxxl:vector 的 RAM 使用情况的说法是正确的。

请参阅以下代码:

#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 GiB。

Windows 管理器是否显示相同?这可能只是 Windows 上的 STXXL 错误,还是任务管理器显示不同的内存大小?

于 2013-12-16T09:04:01.567 回答
2

我猜您正在使用STXXL::VECTOR_GENERATOR模板来创建stxxl::vector您在帖子中提到的 25 ?'s的内部内存使用stxxl::vector通常取决于您的个人配置(即block_size * page_size * cache_pages),如STXXL::VECTOR_GENERATOR 上的 STXXL 文档中所述。所有这些加起来就是保留的内部(=主)内存消耗。据我所知,STXXL 会根据这些模板参数尝试分配与容器使用(如果可能)一样多的内部内存作为缓存。

注意:上述模板参数的默认值为:

page_size = 4 
cache_pages = 8 
block_size = 2 MiB

这导致总内存消耗为25 * (2 MiB * 4 * 8) = 1600 MiB,这解释了您报告的 2 GB 内存消耗的很大一部分。

(注意:哪个 data_type (ValueType) 存储在您的 STXXL 向量中并不重要。)

于 2013-12-09T18:54:52.303 回答