2

尝试处理庞大的数据集时,我一直在使用方便的STXXL库。尽管在尝试使用/生成多维向量时遇到了一个小问题。

以下程序将系统冻结一段时间,然后被杀死。命令行没有输出:

typedef stxxl::vector<int> vector;
typedef stxxl::vector<vector> vector_2d;
typedef stxxl::vector<vector_2d> vector_3d;    

vector_3d numbers(5);

for (auto & rc : numbers){
    rc = vector_2d(5);
    for (auto & r : rc ){
        r = vector(5);
        std::generate(r.begin(), r.end(), custom_random);
    }
}
for (auto rc : numbers){
    for(auto r : rc){
        for(auto n : r){
            std::cout << n << " ";
        }
        std::cout << std::endl;
    }
    std::cout << "-----" << std::endl;
}

使用调试器单步执行程序,发现冻结发生在以下行:

vector_3d numbers(5);

我正在使用 1.3.1 版的 STXXL,并在 Linux 上使用 GCC 4.8.1 对其进行编译。我不确定我在这里缺少什么。将向量更改为 STD 版本,使其工作。如果简化为 2D 矢量,它也可以工作。

编辑:还尝试了 STXXL 的最新稳定版本(v 1.4.0),但无济于事。出现同样的问题。

4

2 回答 2

3

根据STXXL FAQ的“参数化 STXXL 容器”部分, sstxxl::vector<stxxl::vector<T> >是一个无效的结构。

STXXL 容器只能包含 POD 类型。

于 2014-06-06T16:06:57.453 回答
0

我遇到了这个问题,简而言之,我应该说你必须改变你对 stxxl 的看法,然后你可以编程任何你想要的东西,在这种情况下你可以做类似的事情:

typedef stxxl::vector<std::vector<std::vector<int>>> vector_3d;    

vector_3d numbers(5);
vector<vector<int>> a;
vector<int> b;
b.push_back(1);
b.push_back(3);
a.push_back(b);
numbers.push_back(a);

您应该知道 stxxl 的唯一目的是“非常大的内存”管理,因此您应该以 stxxl 在非常大时可以管理的方式编写代码。

于 2015-12-14T17:45:58.803 回答