针对大型嵌套向量的高效内存分配
Efficient memory allocation for large nested vectors
我正在创建一个存储在嵌套向量中的巨大矩阵:
typedef vector<vector<pair<unsigned int, char>>> Matrix;
外部向量最终将包含约4000000个向量,每个向量最多包含约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%的速度很快,但外部向量增长得越大,整个过程就越慢。我很确定有一些优化是可能的,但我不是这个领域的专家。有什么简单的技巧可以加快速度吗?或者我的尝试有什么重大失误吗?
最好只使用一个一维向量,并在某些函数/类中封装行、列索引。这样就保证了整个矩阵的存储器是连续的。
而不是使用push_back
预先分配整个矩阵:
std::vector<pair<unsigned int, char>> matrix(rows * cols);
我将从明显的优化开始。如果在开始填充值(或可用上限)之前就知道行数,那么只需事先保留空间即可。当推回大量值时,花费的大部分时间是通过重新分配内存和复制已包含的值。
Matrix matrix(rows);
for(unsigned i = 0; i < rows; i++) {
vector<pair<unsigned int, char>> row(cols);
for(unsigned j; j < cols; j++) {
row[j] = // value
}
matrix[i] = row;
}
使用VS 2010编译器,以下操作效果最佳:
Matrix matrix;
matrix.reserve(rows);
vector<pair<unsigned int, char>> row;
row.reserve(cols);
for (unsigned int i = 0; i < rows; i++) {
for (unsigned int j = 0; j < cols; j++) {
// ...calculations...
row.push_back( pair<unsigned int, char>(x, y) );
}
matrix.push_back(row);
row.clear();
}
只创建一个用于构建所有行的向量比创建一个每次为"列"条目分配内存的新向量消耗的内存要少得多。但不太清楚为什么会这样。
然而,我接受Andreas的回答,因为这只是我特定案例的解决方案,而他的回答提供了此类优化所需的一般信息。
当外部向量增长时,问题是大量数据复制。考虑将typedef更改为
typedef vector< shared_ptr< vector<pair<unsigned int, char>> > > Matrix;
并在开始用值填充之前执行matrix.reserve(rows)
。
相关文章:
- 将字符串存储在c++中的稳定内存中
- C++中高效的大型稀疏块压缩线性方程
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 字符串的内存高效向量
- 迭代算法之前的高效内存分配
- 适用于 std::unique_ptr 的内存高效自定义删除器?
- 在 mmap 内存中高效分配动态数组
- 针对大型嵌套向量的高效内存分配
- C++中的内存高效双向映射
- 用于 SDL 纹理的内存高效资源管理器
- 如何在设备内存中高效地混洗数据
- 如何在大文件上高效地使用文件输入/输出功能(使用有限大小的内存)
- 是否可以强制GCC为内存对齐的对象生成高效的构造函数
- 高效编码与内存管理
- 使用迭代器进行内存高效词法分析
- 一个内存高效的SHA1实现