首先,我使用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。我需要有效地保存它们并且可以接受建议。
答案 0 :(得分:2)
使用Notepad ++查看XML或YML或.bin文件的内容。 (顺便说一句,如果你指定一个以.bin结尾的路径,OpenCV会以YAML格式写出来......)
您会看到float
中的每个CV_32F Mat
都是以6.49999976e-001
这样的格式编写的。这代表 15个字节,而不是float的预期4个字节。这是15/4 = 3.75 的比率。如果您为',' '\n' or ' '
等格式添加所有字符,则可能会达到比RAM上大4倍的大小。
如果您尝试保存Mat
内部只有零,您将看到该大小与您在RAM中的大小非常相似,因为零写为0.
。如果以XML格式保存,它实际上更小。