海量数据读取

johnyang628 2010-07-19 11:21:46
数据文件为文本格式,单个数据为double型,也需要将数据读取为double型,小数位数排列非常整齐,3列,如
110.32344402 213.23445667 234.2445
239.23898666 485.96897821 232.2154
……
行数从几万到几千万不等,之前直接读取为double型再存储,那个速度太慢,后来改为采用geiline()一行行的读取之后再采用itof转为double型再存储,效率提高了不少,但是数据量达到几百万行甚至几千万以上时,觉得读取的速度还是有点慢,不知是否还有其他的好的方法,请各位指点。
...全文
244 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
hztj2005 2010-07-21
  • 打赏
  • 举报
回复
我也遇到同样的问题,听说内存映射文件可以提高速度,但一直没试过,在这里向大家学习。
cdsnpeter 2010-07-21
  • 打赏
  • 举报
回复
是用内存影射文件吧。 如果你的程序已经写完了的话,使用内存影射文件改写打开文件的部分,影射到一块(或者多块Buffer上)。然后用这个Buffer做成CMemFile,这样就可以基本不用改动你处理文件内容的部分了,因为CMemFile和CFile的大部分的函数都一样。 和FILE*的操作函数的区别也比较小,对你程序的改动会最小。
adamwyb 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 johnyang628 的回复:]
但是如果有1千万行数据,那么每读取一行就需要比较是否达到设定的比例,同样要花费时间啊
[/Quote]
那就读取50万行再比较一次。可以用一个值保存总共的行数,再用一个递增的值保存已经读取的行数。
johnyang628 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 adamwyb 的回复:]
引用 8 楼 johnyang628 的回复:
数据量太大,我目前处理的一个文件已经达到700MB,最大估计将达到2GB,在目前的项目中,只是将数据从文件中读入内存作为参考用,不写文件,另外有没有一个比较好的显示进度百分比的方法,读一行显示一个百分比不现实。


百分比首先要知道你总共有多大的文件要读,然后根据你已经读取了多少进行比较。而且如果怕影响速度不一定百分之一的进度也要显示,可以达……
[/Quote]

但是如果有1千万行数据,那么每读取一行就需要比较是否达到设定的比例,同样要花费时间啊
chengtao999 2010-07-20
  • 打赏
  • 举报
回复
geimutilline


IO操作是比较费时,一次性尽量多读点。
sensan 2010-07-20
  • 打赏
  • 举报
回复
数据一次性从文件中读取,处理时如果慢的话可以考虑多线程,对内容以若干行为单位分组后给每个处理线程
adamwyb 2010-07-19
  • 打赏
  • 举报
回复
一次性全部读到内存中,再进行转换,这样速率会提高。花费时间主要是在读取文件上。
wang23432 2010-07-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 stonewater 的回复:]
geiline可以改为用大缓存一次多读取些数据
其实可以采用内存映像文件,如果文件不是很大,可以直接全部映射,或者用多线程同时读取不同的部分进行转换,不过程序复杂度会提高
写文件也是,用大缓存到一定的数量时再写
[/Quote]
能否详细说明那
3jaja 2010-07-19
  • 打赏
  • 举报
回复
//以下例子使用100M内存
HANDLE hMap=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE, 0,102400000,"海量数据");
double * pd = (double *)MapViewOfFile(hMap,FILE_MAP_READ|FILE_MAP_WRITE,0,0,0);

//一次打开读文件
//处理..........................
//一次打开写文件

UnmapViewOfFile(pd );
CloseHandle(hMap);
jyh_baoding 2010-07-19
  • 打赏
  • 举报
回复
合理的使用缓存
stonewater 2010-07-19
  • 打赏
  • 举报
回复
geiline可以改为用大缓存一次多读取些数据
其实可以采用内存映像文件,如果文件不是很大,可以直接全部映射,或者用多线程同时读取不同的部分进行转换,不过程序复杂度会提高
写文件也是,用大缓存到一定的数量时再写
InitialJ 2010-07-19
  • 打赏
  • 举报
回复
转换后先存在内存中好了,频繁的写硬盘很慢的,就算几百万行的数据也不过就几十M而已
dulvtianya 2010-07-19
  • 打赏
  • 举报
回复
帮顶,学习
似水流年__ 2010-07-19
  • 打赏
  • 举报
回复
一块一块处理
向立天 2010-07-19
  • 打赏
  • 举报
回复
用内存映射文件
我处理过400兆的
再大的可以分块处理
Eleven 2010-07-19
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 johnyang628 的回复:]
原始的数据文件就是文本格式的啊,我只是读取文件中的所有数据并从中挑选符合要求的数据,不对原始文件进行任何修改,读取之后的数据也不存储。
[/Quote]
大文件的话,用内存映射文件做吧。。。
johnyang628 2010-07-19
  • 打赏
  • 举报
回复
原始的数据文件就是文本格式的啊,我只是读取文件中的所有数据并从中挑选符合要求的数据,不对原始文件进行任何修改,读取之后的数据也不存储。
Eleven 2010-07-19
  • 打赏
  • 举报
回复
为啥不用数据库?
zgl7903 2010-07-19
  • 打赏
  • 举报
回复
数据不要按文本方式存储,就按double的内存16进制方式存储,既节省存储空间,又省去转换的麻烦,效率会大大提高.
adamwyb 2010-07-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 johnyang628 的回复:]
数据量太大,我目前处理的一个文件已经达到700MB,最大估计将达到2GB,在目前的项目中,只是将数据从文件中读入内存作为参考用,不写文件,另外有没有一个比较好的显示进度百分比的方法,读一行显示一个百分比不现实。
[/Quote]

百分比首先要知道你总共有多大的文件要读,然后根据你已经读取了多少进行比较。而且如果怕影响速度不一定百分之一的进度也要显示,可以达到百分之五就显示一次,甚至百分之十。百分比只是告诉用户的一个参考,没有用户去专门关心进度真正走到哪里了。
加载更多回复(2)

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧