为啥 cv::Mat 的 RAM 和硬盘大小总是有 4.5 倍的差异?

Posted

技术标签:

【中文标题】为啥 cv::Mat 的 RAM 和硬盘大小总是有 4.5 倍的差异?【英文标题】:Why there is always 4.5 times difference between RAM and hard disk size of a cv::Mat?为什么 cv::Mat 的 RAM 和硬盘大小总是有 4.5 倍的差异? 【发布时间】:2016-06-28 07:44:10 【问题描述】:

首先,我使用 C++。我有一个 CV_32F cv::Mat,当我使用 FileStorage 将它写到磁盘时,这个 Mat 的大小比程序执行期间它在 RAM 上时的大小大约高 4.5 倍。我做了一些实验,每次都是这样。因此,当我再次尝试读取时,显然我的 RAM(6 GB) 变得不足,尽管它不是在程序执行期间。

这是我将其写入磁盘的方式:

FileStorage fs( PATH, FileStorage::WRITE);
fs << "concatMat" << concatMat;
fs.release();

这就是我在程序执行期间计算占用 RAM 大小的方式:

size_t sz= sizeof( concatMat) + concatMat.total()*sizeof( CV_32F);

我想知道这背后的原因,尤其是为什么总是有 4.5 倍的差异?

编辑:我用 .bin 扩展名保存它们,而不是 YAML 或 XML。我需要有效地保存它们并接受建议。

【问题讨论】:

sizeof(CV_32F) 4?至少sizeof(CV_32FC3) 不正确? sizeof(CV_32F) 给出与sizeof(float) 相同的结果,即 4 OpenCV 以 YAML 格式写入,如果您指定以 .bin 结尾的路径... @Aka FileStorage 存储为 YAML,除非您指定 XML。没有存储二进制数据的选项。 是的,我意识到它保存为 YAML 虽然它是一个 .bin 文件。我怎样才能有效地存储它? 【参考方案1】:

使用 Notepad++ 查看 XML 或 YML 或 .bin 文件的内容。 (顺便说一句,如果你指定一个以.bin结尾的路径,OpenCV会以YAML格式写...)

您会看到CV_32F Mat 中的每个float 都以类似6.49999976e-001 的格式写入。这表示 15 个字节,而不是浮点数预期的 4 个字节。这是 15 / 4 = 3.75 的比率。如果您将所有用于格式化的字符(如 ',' '\n' or ' ')添加到其中,您可能会达到比 RAM 上的大小大 4 倍以上的大小。

如果您尝试保存内部只有零的Mat,您会看到其大小与您在 RAM 中的大小非常相似,因为零写入了0.。如果保存为 XML 格式,它实际上会更小。

【讨论】:

见鬼,是的。你是对的,虽然它是一个 .bin 文件,但它会将它们保存为 YAML 格式。我怎样才能有效地存储它们? 据我所知(目前可能还没有),FileStorage 可能帮不了你。您可以尝试从您的Matfloat* 数据指针中找到一个写入真实.bin 文件的库。我对这里不是很了解。 @阿卡

以上是关于为啥 cv::Mat 的 RAM 和硬盘大小总是有 4.5 倍的差异?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV cv::Mat 大小限制

cv::Mat.data 总是返回相同的值

为啥将 cv::Mat 的一列复制到向量中失败?

为未知大小的 cv::Mat 保留向量内存

将 cv::Mat 向量复制到浮点向量的最佳方法是啥?

调整图像类型“Mat”opencv C++的大小