不同方式下文件读取和存储的比较(OpenCV 中FileStorage与C++中文件流ofstream/ifsteam比较)

// testFile.cpp : 
//**************不同方式下文件读取和存储的比较****************//
//在OpenCV2.0以后的版本中,加入了对C++的支持,大大减少了程序代码量,方便了程序编写,也更符合现代编程思想。
//在视觉处理过程中,往往需要保存中间数据。这些数据的数据类型往往并不是整数。OpenCV的C++接口中,用于保存图像的
//imwrite()函数只能保存图像格式的整数数据。当需要保存浮点数据或XML/YML文件时,OpenCV的C语言接口提供了cvSave函数,
//但这一函数在C++接口中已经被删除。取而代之的是FileStorage类。
#include "stdafx.h"
#include <opencv2/core/core.hpp>
#include <iostream>
#include <string>
#include <vector>
#include <time.h>
#include<fstream>


using namespace std;
using namespace std;
using namespace cv;


int _tmain(int argc, _TCHAR* argv[])
{
int nIter=1;
clock_t t1,t2,t3,t4,t5,t6,t7;


t1 = clock();
//1-2-读入两个文件
Mat mx;
Mat my;
FileStorage fs1("mx.xml", FileStorage::READ);
if (!fs1.isOpened())  
return -1;
FileStorage fs2("my.xml", FileStorage::READ);
if (!fs2.isOpened())  
return -2;
for (int i=0;i<nIter;i++)
{
fs1["mx1"]>>mx;
fs2["my1"]>>my;
}
fs1.release();
fs2.release();
t2 = clock();
cout<<"1-2-FileStorage::READ *.xml file: "<<(t2-t1)/1000.0<<"s"<<endl;


//3-写入一个文件(与读入相比,写入的速度非常慢,循环次数多了就很容易看出来这一点)
FileStorage fs3("mxy.xml", FileStorage::WRITE );//READ、WRITE、APPEND、+FileStorage::MEMORY
if (!fs3.isOpened())  
return -3;
for (int i=0;i<nIter;i++)
fs3<<"mx"<<mx<<"my"<<my;
fs3.release();
t3 = clock();
cout<<"3-FileStorage::WRITE *.xml file: "<<(t3-t2)/1000.0<<"s"<<endl;


//4-读入一个文件(虽然与1-2-中读入的内容是一样的,但是与1-2-相比速度要快很多,并不是倍数的关系:
//原因是实际读入数据是非常快的,如果数据量少的话,实际花费时间都浪费在打开文件上面了)
Mat mx2, my2;
FileStorage fs4("mxy.xml", FileStorage::READ );
if (!fs4.isOpened())  
return -1;
for (int i=0;i<nIter;i++)
{
fs4["mx"]>>mx2;
fs4["my"]>>my2;
}
fs4.release();
t4 = clock();
cout<<"4-FileStorage::READ *.xml file: "<<(t4-t3)/1000.0<<"s"<<endl;


//5-利用文件流写入txt文件
ofstream    outfile;//outfile也是一个文件流,用来操作输出文件  
outfile.open("data.txt");
if(!outfile) 
{  
cout<<"写入文件不存在"<<endl;  
return -5;
}  
outfile<<mx2<<endl<<my2;
outfile.close();
t5 = clock();
cout<<"5-ofstream::WRITE *.txt file: "<<(t5-t4)/1000.0<<"s"<<endl;


//6-利用文件流读入txt文件
ifstream    infile; //infile是一个文件流,因此其实还是对流进行的操作  
infile.open("data.txt");
if(!infile) 
{  
cout<<"读入文件data.txt不存在"<<endl;  
return -6;
}  
char c;
float f;
//infile>>mx22>>my22;//语法上这行语句是错误的,下面的语句通过循环的方式一个数一个数读入的方式来实现这句的功能;
Mat mx22(mx2.rows, mx2.cols, CV_32F, Scalar(0)), my22(my2.rows, my2.cols, CV_32F, Scalar(0));
infile>>c;//[
for (int i=0;i<mx22.rows;i++)
{
for (int j=0;j<mx22.cols;j++)
{
infile>>f>>c;//float,
mx22.at<float>(i,j)=f;
}
}
infile>>c;//]
infile>>c;//[
for (int i=0;i<my22.rows;i++)
{
for (int j=0;j<my22.cols;j++)
{
infile>>f>>c;//float,
my22.at<float>(i,j)=f;
}
}
infile>>c;//]
infile.close();
t6 = clock();
cout<<"6-ofstream::READ *.txt file: "<<(t6-t5)/1000.0<<"s"<<endl;


//7-利用文件流写入txt文件,验证6中读入的结果,与5的不同之处在于这里不是简单的outfile<<mx22<<my22,而是循环着一个个的写入;
mx22-=mx2;//应全为0
my22-=my2;//应全为0
outfile.open("data2.txt");
if(!outfile) 
{  
cout<<"写入文件data2.txt不存在"<<endl;  
return -5;
}  
//outfile<<mx22<<my22;//下面的语句通过循环的方式一个数一个数写入的方式来实现这句的功能;
for (int i=0;i<mx22.rows;i++)
{
for (int j=0;j<mx22.cols;j++)
{
outfile<<mx22.at<float>(i,j)<<", ";
}
outfile<<endl;
}
for (int i=0;i<my22.rows;i++)
{
for (int j=0;j<my22.cols;j++)
{
outfile<<mx22.at<float>(i,j)<<", ";
}
outfile<<endl;
}
outfile.close();
t7 = clock();
cout<<"7-ofstream::WRITE *.txt file: "<<(t7-t6)/1000.0<<"s"<<endl;


getchar();
return 0;
}


//如果是读取和写入数据量很大的文件,就需要用比较高级一点儿的方法了!
//1-“内存文件映射”技术(Linux: mmap,Windows: CreateFileMapping);(可参考飞鸽(ipmsg)的源码)
//  Windows提供了一个非常好的技术,内存映射文件,将文件映射到进程的地址空间
// (1).32位系统可以处理大于2G的文件,不需要换系统,并且如果依赖系统会限制应用的使用场合
// (2).不要企图一次性将非常大的数据放入内存,这并不能提高多少效率,反而可能导致系统运行缓慢
// (3).对于大数据处理,使用内存映射文件,一次映射一部分,处理完毕后,映射下一部分,分而治之


//fstream file("store_file", ifstream::binary);
//size_t idx1 = 7640848;
//size_t idx2 = 9640848;
//float* data= new float[idx2 - idx1];
//file.seekg(sizeof(float) * idx1);
//file.read((char*)data, sizeof(float) * (idx2 - idx1));
//delete []data;


//2-借助于专业的数据库(如内存数据库fastdb);
//3-设计一定的逻辑(哈希映射),将大文件实现换为规律分布的小文件,按照设计的规则索引到指定的小文件里读取,
//动态加载所需要的文件;


//fseek()/lseek()定位位置
//首先考虑设计、再考虑算法、最后才是具体程序实现


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值