gpt4 book ai didi

c++ - C++ 中的一个非常大的 3D 数组

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:44:07 26 4
gpt4 key购买 nike

要点是:我正在编写一种愚蠢的程序,它获取手绘声波的 BMP 图像并将其转换为实际声音。它工作正常,但我正在寻找一种将整个图像加载到内存中的好方法。我目前使用 std::vector 加载一个 500 MB 的图像,只是为了在任务管理器中看到该进程分配了太多我的 8GB RAM,以至于它需要额外的分页(停止在 6 GB 左右)。我想这是某种开销......

我的问题是:是否有更节省内存的方法来分配巨大的 3D 数组?是否有任何速度高效的方法来逐字节读取大文件? (我在等待它加载时正在写这篇文章,大约 50 分钟后它是 85%)

编辑操作系统是 64 位 Windows。它甚至超过 6GB,RAM 对它来说太小了,所以 Windows 开始将数组放在分页文件中(我做了一个小百分比指示器,当时分配大约是 80%)。

这是我用于分配的代码

vector <vector<vector<char> > > raster_data; //declaration
raster_data.resize(width);
for(int i=0; i<width; i++)
{
raster_data[i].resize(height);

for(int j=0; j<height; j++)
{
raster_data[i][j].resize(3); //(24bpp=3Bpp)
}
}

所以我不是通过 push_back() 写入数据,而是像普通数组一样访问 vector :

raster_data[i][j][k] // in a 3d for loop

最佳答案

您所说的 3D 数组更像是一个包含 RGB 元素的 2D 数组,500Mb 在那些日子里真的不算“非常大”。

您使用 std::vector 的方法应避免仅存储 3 个字节 ( char ),因为:

  • std::vector ifself 消耗了比 3 个字节更多的字节(您可以通过检查 sizeof(std::vector<char>) 的结果知道多少。
  • 你分配的内存是碎片化的

传统上,对于加载 2D 位图的用例,内存分配在单个 block 中,然后使用计算索引访问值。

过度简化,这将是这样的:

struct rgb {            // you should check that sizeof(rgb) == 3*sizeof(char), just to be sure
char channels[3];
};
std::vector<rgb> raster_data;
raster_data.resize(width*height);
// channel access :
raster_data[j*width+i][k] = ...;

你可以像这样在缓冲区中有效地读取整个文件内容,但是你需要考虑每一行的对齐方式,而且在我的脑海中,我真的不能说它是哪一个(我相信每个行在 4 字节边界上对齐)。

为了让你了解更多关于在 C/C++ 中处理 BMP 位图数据,我强烈建议你看一下 Handmade Hero,它从一开始就涵盖了这个主题,我相信这一集:https://www.youtube.com/watch?v=ofMJUSchXwo

关于c++ - C++ 中的一个非常大的 3D 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30628934/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com