为啥 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
可能帮不了你。您可以尝试从您的Mat
的float*
数据指针中找到一个写入真实.bin 文件的库。我对这里不是很了解。 @阿卡以上是关于为啥 cv::Mat 的 RAM 和硬盘大小总是有 4.5 倍的差异?的主要内容,如果未能解决你的问题,请参考以下文章