【发布时间】:2021-05-14 14:09:59
【问题描述】:
我正在使用 4D 矩阵(使用 STL 向量)。通常,尺寸是不同的。例如,我正在读取一个尺寸为 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 矩阵一起使用,当我运行它时,我的计算机没有响应。
我不确定这是否是 RAM 问题。我的电脑有 12GB RAM,如果我没记错的话,矩阵的大小是 8GB。
知道如何解决这个问题吗?
编辑
200x200x200x200 矩阵的内存使用率为 56.7%
【问题讨论】:
-
什么操作系统?什么版本?什么位大小?这些都是重要的问题。例如:Windows 10 Home 64 位的进程内存限制为 128 GB,远高于您的要求。但是,所有 Windows 10 32 位版本的进程内存限制为 4 GB,是您最大要求大小的一半。
-
您的程序具有
O(n^4)时间复杂度。这意味着运行程序的时间刚刚超过某个n。这很可能是发生的事情。您的程序可以运行,但需要很长时间才能完成。 -
@Miguel Posadas 你能提供更多细节吗?你的电脑没有响应是什么意思?你要等多久?您是否还监视内存使用情况?您是正确的,它将为该矩阵分配 8GB 内存,但是因为您不调用 reserve 它也会进行 很多向量调整大小。
-
@MiguelPosadas 你说它适用于 200x200x200x200 矩阵,你能用那个矩阵再次运行它并发布内存使用情况吗?还有你的正常内存使用情况。
-
运行发布版本(优化)通常会快很多倍。还可以尝试在填充它们之前保留向量空间,这将避免代价高昂的重新分配。见
vector::reserve。最后,您不需要push_back清空子向量,您只需resize()将自动创建所需元素的向量(从而也节省时间和内存)。