• 28575阅读
  • 10回复

关于QT大文件读写——内存映射 [复制链接]

上一主题 下一主题
离线louis_liux
 

只看楼主 正序阅读 楼主  发表于: 2015-01-31

近期写程序,需要对大文件进行读写操作,使用传统的QFile发现效率及其地下,于是想到了内存映射。
一查文档发现QFILE自带一个map函数,看了半天没有理解如何使用。
本人新手,以前未接触过内存映射,有哪位能给小弟发个QT下使用内存映射的例子,感激不尽。

只需要一段如何使用的代码段即可,谢谢了。

这种事文本格式,求段代码怎么把格式读出来用内存映射
410275.57 4207529.63    598.282
410275.90 4207542.12    616.827
410276.22 4207554.62    638.021
410276.54 4207567.11    656.056
410276.87 4207579.61    686.688
410277.19 4207592.10    701.087


QFile file(fileName);
      file.open(QIODevice::ReadWrite );
      uchar* fpr = file.map(0, file.size());//映射文件,注意这里的file.size()如果大于系统的虚拟内存,就要对文件分块映射
                                   //其实对于大文件一般都是进行分块映射的。
     if(fpr)
      {
          //do something   to fpr
          unmap(fpr);
      }
      file.close()

看到网上有这篇内容,不会怎么修改,求用文件映射把这个内容读出来,小弟感激不尽
离线roywillow

只看该作者 10楼 发表于: 2015-02-05
回 louis_liux 的帖子
louis_liux:那改怎么做呢,把它输出来 (2015-02-05 08:02) 

在unmap前,fpr就相当于是一个数组啊
数组的操作你总会吧?
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线louis_liux

只看该作者 9楼 发表于: 2015-02-05
回 roywillow 的帖子
roywillow:fpr就是一个uchar的指针啊,你让qDebug输出这个指针干嘛……并且还是在unmap之后,就算你想输出指针对应的内容,这个时候干这事是不是已经晚了,就跟你delete一个对象之后还去调用他一样 (2015-02-03 20:26) 

那改怎么做呢,把它输出来
离线louis_liux

只看该作者 8楼 发表于: 2015-02-05
回 uidab 的帖子
uidab:fpr 就相当于整个映射的起始地址,然后你想读哪个地址的就在这上边增加就可以。
txt读出来的肯定是ASCII码,你还要一个一个字节的转。二进制的好一些,你直接取地址,给对应的double。 (2015-02-03 14:30) 

能有代码分享参考下吗?小弟我菜鸟啊
离线roywillow

只看该作者 7楼 发表于: 2015-02-03
fpr就是一个uchar的指针啊,你让qDebug输出这个指针干嘛……并且还是在unmap之后,就算你想输出指针对应的内容,这个时候干这事是不是已经晚了,就跟你delete一个对象之后还去调用他一样
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线uidab

只看该作者 6楼 发表于: 2015-02-03
fpr 就相当于整个映射的起始地址,然后你想读哪个地址的就在这上边增加就可以。
txt读出来的肯定是ASCII码,你还要一个一个字节的转。二进制的好一些,你直接取地址,给对应的double。
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线louis_liux

只看该作者 5楼 发表于: 2015-02-02
回 uidab 的帖子
uidab:        能否把文件内容改为二进制保存,这样一个浮点数统一是32bit,你用内存映射很容易读取。如果是文本格式的话,每个数字都要占一个字节,而且数字与数字之间怎么分也不知道。
 (2015-02-02 10:13) 

每个数字之间用空格做分割,用二进制也可以啊,只是不知道二进制和txt 的格式都读不出来呢,这个
离线louis_liux

只看该作者 4楼 发表于: 2015-02-02
回 dbzhang800 的帖子
dbzhang800:你给的列子已经完全展示了QFile内存映射的用法。文件内容都已经直接可用了,如果你仍然有疑问,那就和内存映射以及文件读取什么的没有关系了。 (2015-02-02 10:15) 

QFile file(fileName);
      file.open(QIODevice::ReadWrite );
      uchar* fpr = file.map(0, file.size());//映射文件,注意这里的file.size()如果大于系统的虚拟内存,就要对文件分块映射
                                   //其实对于大文件一般都是进行分块映射的。
     if(fpr)
      {
          //do something   to fpr
          unmap(fpr);
         qDebug()<<fpr;
      }
      file.close()
可是我这样弄出不来东西呢啊
这里该如何写呢
离线stlcours

只看该作者 3楼 发表于: 2015-02-02
请教一下各位,使用文件映射的话,计算MD5会不会快一点?
离线dbzhang800

只看该作者 2楼 发表于: 2015-02-02
你给的列子已经完全展示了QFile内存映射的用法。文件内容都已经直接可用了,如果你仍然有疑问,那就和内存映射以及文件读取什么的没有关系了。
离线uidab

只看该作者 1楼 发表于: 2015-02-02
        能否把文件内容改为二进制保存,这样一个浮点数统一是32bit,你用内存映射很容易读取。如果是文本格式的话,每个数字都要占一个字节,而且数字与数字之间怎么分也不知道。
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
快速回复
限100 字节
 
上一个 下一个