为什么 cv::Mat 的 RAM 和硬盘大小总是相差 4.5 倍?

Why there is always 4.5 times difference between RAM and hard disk size of a cv::Mat?

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

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

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

我是这样计算程序执行过程中占用内存大小的:

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

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

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

用 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格式,实际上会更小。