首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

大文件快速读取并存入数组

2012-06-24 
大文件高速读取并存入数组文件如下格式496830.955 5419161.934 278.067 31496830.943 5419161.538 278.117

大文件高速读取并存入数组
文件如下格式
496830.955 5419161.934 278.067 31
496830.943 5419161.538 278.117 17
496830.924 5419160.610 275.182 141
496830.912 5419160.200 275.228 150
496830.900 5419159.780 275.226 143
整个文件有伍佰万行左右,每行有4个浮点数,用空格隔开。程序的目的是将以上数据读入数组,我已经实现了但是速度很慢。
考虑了一下,应该是每读一行时都要访问硬盘导致的。于是我想每次读入一块数据(整个数据一次读入有困难),可以大大提高读入速度。请问有什么办法,可以一次读入一块数据,并将其以浮点形式存数数组呢?
而且,我试着一次将整个文件读入内存(新建了个小文件),存入char类型的buffer,但是我只能通过比较原始的方法,逐个字符转化为数字存入数组,有什么方法(或函数)可以方便的从char中读取一行?

[解决办法]
分段内存映射 + memcpy 比较快.

stat获取文件大小,每次映射512M(记住要和剩余文件大小比较取较小者), 循环如下步骤:

初始化:current_offset = 0;

从current_offset扫描找到一个'\n', 如果找到,则将memroy的current_offset偏移量开始到'\n'的字符串strcat追加到临时buffer里,调用sscanf(buffer, "%lf %lf %lf %lf", ...);得到4个浮点数并清空buffer。 如果没找到,则将这一段内存拷贝到临时buffer头部,重新映射下一段512M到memory。

你想问我怎么更快,基本上没有了,因为你存的是文本,没法准确的按一行切开,真心比较恶心,要切办法也有两种,但不太值得那么做。
[解决办法]
1. 你现在用自己的方法读入到数组需要多少时间?
2. 文件比较大,怎样处理都是需要一点时间的。
3. 文件为啥不用二进制方式存储呢?这样应该可以省去一些空间。
4. 每行4个浮点数(假定是float),4 bytes* 5000000 大约是 20M,这是数组需要的内存空间

热点排行