运行 内存不足 C++
Run out of ram C++
我正在使用 4D 矩阵(使用 STL 向量)。通常,尺寸是 different.For 例如,我正在读取一个尺寸为 192x256x128x96 的矩阵,下面的代码用 0 到更大的尺寸(在本例中为 256)。
while(matriz.size() < width) //width es el tamaño de N
{
vector<vector<vector<short>>> aux;
matriz.push_back(aux);
}
for(auto i = 0; i < matriz.size(); i++)
{
while(matriz[i].size() < width)
{
vector<vector<short>> aux;
matriz[i].push_back(aux);
}
}
for(auto i = 0; i < matriz.size(); i++)
for(auto j = 0; j < matriz[i].size(); j++)
while(matriz[i][j].size() < width)
{
vector<short> aux;
matriz[i][j].push_back(aux);
}
for(auto i = 0; i < matriz.size(); i++)
for(auto j = 0; j < matriz[i].size(); j++)
for(auto k = 0; k < matriz[i][j].size(); k++)
while(matriz[i][j][k].size() < width)
{
matriz[i][j][k].push_back(0);
}
该代码适用于中小型 4D 矩阵,我已经尝试使用 200x200x200x200 并且它确实有效,但我需要将它与 256x256x256x256 矩阵一起使用,当我 运行 它时我的电脑没有不回应。
我不确定这是否是内存问题。我的电脑有12GB RAM,如果我没记错的话,矩阵的大小是8GB。
知道如何解决这个问题吗?
编辑
如果我让程序运行,一段时间后它就会被杀死
200x200x200x200 矩阵的内存使用率为 56.7%
让我们看看我是否有这个权利。
您正在生产:
- 1 个向量包含:
- 256 个向量,每个包含
- 256 个向量,每个包含(总共 65,536 个)
- 256 个向量,每个包含(总共 16,777,216 个)
- 256 条短裤(总共 4,294,967,296 条,或您指定的 8,589,934,592 字节)
我不知道每个向量本身的整个大小,但可能远低于 1k,因此您使用的内存不到 10 g。
但是,发生了很多事情。是真的挂了,还是只是花了非常非常长的时间。
一些定期的调试输出将有助于回答这个问题。
一些提示(来自评论):
运行 优化构建 (-O3
),这应该会加快处理速度。
在循环中使用 resize()
而不是空 vector
的 push_back()
。这将防止代价高昂的重新分配。
例如,替换
while(matriz.size() < width) //width es el tamaño de N
{
vector<vector<vector<short>>> aux;
matriz.push_back(aux);
}
有
matriz.resize(width);
如果你仍然需要在循环中使用push_back()
,至少要预先使用reserve()
容量。这可以再次防止代价高昂的重新分配。重新分配向量可以短暂地将其通常使用的内存量增加一倍。
使用 top
等工具实时观察机器上的内存和交换使用情况。如果您注意到 swap space 使用增加,这意味着机器 运行 内存不足。
我正在使用 4D 矩阵(使用 STL 向量)。通常,尺寸是 different.For 例如,我正在读取一个尺寸为 192x256x128x96 的矩阵,下面的代码用 0 到更大的尺寸(在本例中为 256)。
while(matriz.size() < width) //width es el tamaño de N
{
vector<vector<vector<short>>> aux;
matriz.push_back(aux);
}
for(auto i = 0; i < matriz.size(); i++)
{
while(matriz[i].size() < width)
{
vector<vector<short>> aux;
matriz[i].push_back(aux);
}
}
for(auto i = 0; i < matriz.size(); i++)
for(auto j = 0; j < matriz[i].size(); j++)
while(matriz[i][j].size() < width)
{
vector<short> aux;
matriz[i][j].push_back(aux);
}
for(auto i = 0; i < matriz.size(); i++)
for(auto j = 0; j < matriz[i].size(); j++)
for(auto k = 0; k < matriz[i][j].size(); k++)
while(matriz[i][j][k].size() < width)
{
matriz[i][j][k].push_back(0);
}
该代码适用于中小型 4D 矩阵,我已经尝试使用 200x200x200x200 并且它确实有效,但我需要将它与 256x256x256x256 矩阵一起使用,当我 运行 它时我的电脑没有不回应。
我不确定这是否是内存问题。我的电脑有12GB RAM,如果我没记错的话,矩阵的大小是8GB。
知道如何解决这个问题吗?
编辑
如果我让程序运行,一段时间后它就会被杀死
200x200x200x200 矩阵的内存使用率为 56.7%
让我们看看我是否有这个权利。
您正在生产:
- 1 个向量包含:
- 256 个向量,每个包含
- 256 个向量,每个包含(总共 65,536 个)
- 256 个向量,每个包含(总共 16,777,216 个)
- 256 条短裤(总共 4,294,967,296 条,或您指定的 8,589,934,592 字节)
我不知道每个向量本身的整个大小,但可能远低于 1k,因此您使用的内存不到 10 g。
但是,发生了很多事情。是真的挂了,还是只是花了非常非常长的时间。
一些定期的调试输出将有助于回答这个问题。
一些提示(来自评论):
运行 优化构建 (
-O3
),这应该会加快处理速度。在循环中使用
resize()
而不是空vector
的push_back()
。这将防止代价高昂的重新分配。例如,替换
while(matriz.size() < width) //width es el tamaño de N { vector<vector<vector<short>>> aux; matriz.push_back(aux); }
有
matriz.resize(width);
如果你仍然需要在循环中使用
push_back()
,至少要预先使用reserve()
容量。这可以再次防止代价高昂的重新分配。重新分配向量可以短暂地将其通常使用的内存量增加一倍。使用
top
等工具实时观察机器上的内存和交换使用情况。如果您注意到 swap space 使用增加,这意味着机器 运行 内存不足。