我正在使用STXXL开发一个项目,我理解这是一个C ++ STL库的核心版本。目前,我的程序运行正常,但我现在面临的问题是,当程序运行时,它使用接近2GB的内存(具有中低大小的数据集)。
在我的程序中,我使用了25个STXXL向量,存储在磁盘上的各个文件中。至于我的.stxxl文件,我目前设置为动态分配磁盘文件(通过将磁盘大小设置为0)。
所以,我的问题是:有没有办法明确让STXXL使用硬盘而不是RAM?或者使用此库时预计会占用多少内存?
提前感谢任何人都可以提供的建议。
答案 0 :(得分: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错误,还是只是任务管理器显示不同的内存大小?
答案 1 :(得分:2)
我猜您使用STXXL::VECTOR_GENERATOR
模板创建了您在帖子中提到的25个stxxl::vector
? stxxl::vector
的内部内存使用量一般取决于STXXL documentation on STXXL::VECTOR_GENERATOR中所述的个人配置(即block_size * page_size * cache_pages
)。
这一切总结为保留的内部(=主)内存消耗。
据我所知,STXXL尝试分配尽可能多的内部内存,因为容器正在使用(如果可能)作为缓存,具体取决于这些模板参数。
注意:上述模板参数的默认值为:
page_size = 4
cache_pages = 8
block_size = 2 MiB
这导致总内存消耗 25 *(2 MiB * 4 * 8)= 1600 MiB ,这解释了您报告的2 GB内存消耗的很大一部分。
(注意:哪个data_type(ValueType)存储在STXXL向量中应该不重要。)