【发布时间】:2012-08-17 11:44:56
【问题描述】:
我正在创建一个存储在嵌套向量中的巨大矩阵:
typedef vector<vector<pair<unsigned int, char>>> Matrix;
外部向量最终将包含约 400.000 个向量,每个向量最多包含约 220 对(大多数包含较少)。这需要大约 1GB 的 RAM,并且是这样完成的:
Matrix matrix;
for (unsigned int i = 0; i < rows; i++) {
vector<pair<unsigned int, char>> row;
for (unsigned int j = 0; j < cols; j++) {
// ...calculations...
row.push_back( pair<unsigned int, char>(x, y) );
}
matrix.push_back(row);
}
前 20% 的速度非常快,但外部向量增长得越大,整个过程的速度就越慢。我很确定可以进行一些优化,但我不是该领域的专家。有什么简单的技巧可以加快速度吗?还是我的尝试有什么重大错误?
【问题讨论】:
-
你确定你有足够的内存来分配它们吗?也许您的操作系统正在使用交换文件...
-
我猜如果你需要一个那么大的矩阵,这个矩阵将是一个稀疏矩阵。在这种情况下,您最好这样处理矩阵。见en.wikipedia.org/wiki/Sparse_matrix
-
@AlexanderChertov 是的,我确定有足够的内存。
-
@AlexanderChertov 如果他使用的是 c++11,那么增长约 400.000 个向量或约 400.000 个共享指针的向量是可比的。不过,在 c++03 中你是完全正确的。
-
@Niko 对此进行了扩展:当向量增长时,它首先分配一个新的内存块来包含所有内容,然后将它已经拥有的所有内容移动到新位置,然后释放旧内存块。在 c++03 中移动内容需要复制包含的对象(因此是内部向量的副本),在 c++11 中,内部对象只是被移动 - 并且移动向量非常快。
标签: c++ optimization memory-management