海量数据读取

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型再存储,效率提高了不少,但是数据量达到几百万行甚至几千万以上时,觉得读取的速度还是有点慢,不知是否还有其他的好的方法,请各位指点。
...全文
187 点赞 收藏 22
写回复
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]

百分比首先要知道你总共有多大的文件要读,然后根据你已经读取了多少进行比较。而且如果怕影响速度不一定百分之一的进度也要显示,可以达到百分之五就显示一次,甚至百分之十。百分比只是告诉用户的一个参考,没有用户去专门关心进度真正走到哪里了。
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告
暂无公告