2011-11-28 65 views
1

我与超级计算机工作,使用MPI。 但问题.. C++ 有一个程序,该程序打开文件与数据,并读入vector<long>v1使用MPI:C++的std :: bad_alloc的

//open file 
    ... 
    vector<long>v1; 

    while (!f1.eof()){ 
     //input data into 
     v1.push_back(s1); 
    } 

好,当数据文件仅包含5000万个“长号码”的,它完美。 但是当数据文件包含超过75个百万“长号码”的,它失败,异常:

std::bad_alloc(); 

如何改进呢?

此外,使用许多处理器(100)

回答

4

不要使用矢量这一点。矢量要求其所有元素都适合连续的内存位置,并且不适用于非常大的集合。要使用正确的数据结构取决于您的访问模式,list将起作用,但会浪费大量内存(您存储的每个long都有两个指针)。也许你想把long分成100个左右的组,并建立这些组的链表。再次,正确的答案取决于你的实际外部问题。

+2

'deque'接近载体,但零散的存储。 (很明显,控制这种碎片超出了标准控制范围。) – GManNickG

+0

@GMan这将是一件好事。它的工作能力取决于他的STL实施“deque”的“好”(针对他的具体问题)。最有可能的是,它会解决他的问题。 –

1

虽然我没有与超级计算机(所有)太多的经验,我可以告诉你,性病::当您用完系统应该只会出现bad_alloc的资源。

机会是在这种情况下,你已经(或者从操作系统的角度或生理角度{样的到底是一回事})达成的计算机上的堆强加的限制,因为你的载体将是动态在堆上分配元素。

您可以尝试使用top或类似的命令来监视你的资源使用情况,以及对你实际使用的是什么检查您的系统设置。

另外要注意的 - 你应该创建你的载体和调用储备(),如果你知道有多少元素将大致可以使用 - 这将大大提高您的工作效率。

+0

解决方案是切换到更分段容器,所述第一选择是'deque',使得存储器可在片段进行分配。也就是说,这显然会破坏依靠存储连续性的任何事情。 – GManNickG

+0

我同意这一点 - 它抛作为一个答案,因为我没想到那么远过:) –

相关问题