我将对其进行重新设计以充当流式传输,而不是在一个块上。

一个更简单的方法是:

std::ifstream ifs("input.txt");

std::vector parsed(std::istream_iterator(ifs), {});

如果您大致知道期望多少个值,那么预先使用std::vector::reserve它可以进一步加快速度。

另外,您可以使用内存映射文件并遍历字符序列。

更新 我修改了上面的程序以将uint32_ts 解析为向量。

使用4.5GiB [1] 的样本输入文件时,程序将在9秒 [2] 内运行:

sehe@desktop:/tmp$ make -B && sudo chrt -f 99 /usr/bin/time -f "%E elapsed, %c context switches" ./test smaller.txt

g++ -std=c++0x -Wall -pedantic -g -O2 -march=native test.cpp -o test -lboost_system -lboost_iostreams -ltcmalloc

parse success

trailing unparsed: '

'

data.size(): 402653184

0:08.96 elapsed, 6 context switches

当然,它至少分配402653184 * 4 字节= 1.5吉字节。因此,当您读取一个45

GB的文件时,您将需要大约15GiB的RAM来存储矢量(假设重新分配时没有碎片):45GiB解析在45分钟内完成10分钟* :

make && sudo chrt -f 99 /usr/bin/time -f "%E elapsed, %c context switches" ./test 45gib_uint32s.txt

make: Nothing to be done for `all'.

tcmalloc: large alloc 17570324480 bytes == 0x2cb6000 @ 0x7ffe6b81dd9c 0x7ffe6b83dae9 0x401320 0x7ffe6af4cec5 0x40176f (nil)

Parse success

Trailing unparsed: 1 characters

Data.size(): 4026531840

Time taken by parsing: 644.64s

10:45.96 elapsed, 42 context switches

相比之下,仅运行wc -l 45gib_uint32s.txt就花费了大约12分钟(尽管没有实时优先级调度)。wc是 极快

完整代码用于基准测试

#include

#include

#include

namespace qi = boost::spirit::qi;

typedef std::vector data_t;

using hrclock = std::chrono::high_resolution_clock;

int main(int argc, char** argv) {

if (argc<2) return 255;

data_t data;

data.reserve(4392580288); // for the 45 GiB file benchmark

// data.reserve(402653284); // for the 4.5 GiB file benchmark

boost::iostreams::mapped_file mmap(argv[1], boost::iostreams::mapped_file::readonly);

auto f = mmap.const_data();

auto l = f + mmap.size();

using namespace qi;

auto start_parse = hrclock::now();

bool ok = phrase_parse(f,l,int_parser() % eol, blank, data);

auto stop_time = hrclock::now();

if (ok)

std::cout << "Parse success\n";

else

std::cerr << "Parse failed at #" << std::distance(mmap.const_data(), f) << " around '" << std::string(f,f+50) << "'\n";

if (f!=l)

std::cerr << "Trailing unparsed: " << std::distance(f,l) << " characters\n";

std::cout << "Data.size(): " << data.size() << "\n";

std::cout << "Time taken by parsing: " << std::chrono::duration_cast<:chrono::milliseconds>(stop_time-start_parse).count() / 1000.0 << "s\n";

}

[1] 产生od -t u4 /dev/urandom -A none -v -w4 | pv | dd bs=1M

count=$((9*1024/2)) iflag=fullblock > smaller.txt

[2] 显然,这与在Linux上的缓冲区缓存中缓存的文件有关–大文件没有此好处

c语言中文件读写面试题,在C ++中有效读取非常大的文本文件相关推荐

  1. python中文件读写位置的作用-Python中文件的读写

    1.Python中的open()函数 Python中提供了open()内置函数,在默认情况下可以对文件对象进行操作. open()函数将文件名作为唯一必不可少的参数,并返回一个文件对象.如果只指定一个 ...

  2. python中文件读写位置的作用-Python中文件的读写、写读和追加写读三种模式的特点...

    本文主要讨论一下文件的三种可读可写模式的特点及互相之间的区别,以及能否实现修改文件的操作 由于前文已经讨论过编码的事情了,所以这里不再研究编码,所有打开操作默认都是utf-8编码(Linux系统下) ...

  3. C语言之文件读写探究(七):随机读写文件

    相关博文:C语言之文件读写探究(一):fopen.fclose(文件的打开和关闭) 相关博文:C语言之文件读写探究(二):fputc.fgetc.feof(一次读写一个字符(文本操作)) 相关博文:C ...

  4. C语言之文件读写探究(六):fscanf、fprintf(格式化读写文件)

    相关博文:C语言之文件读写探究(一):fopen.fclose(文件的打开和关闭) 相关博文:C语言之文件读写探究(二):fputc.fgetc.feof(一次读写一个字符(文本操作)) 相关博文:C ...

  5. C语言之文件读写探究(四):fwrite、fread(一次读写一块数据(二进制操作))

    相关博文:C语言之文件读写探究(一):fopen.fclose(文件的打开和关闭) 相关博文:C语言之文件读写探究(二):fputc.fgetc.feof(一次读写一个字符(文本操作)) 相关博文:C ...

  6. C语言之文件读写探究(三):fputs、fgets、feof(一次读写一行字符(文本操作))

    相关博文:C语言之文件读写探究(一):fopen.fclose(文件的打开和关闭) 相关博文:C语言之文件读写探究(二):fputc.fgetc.feof(一次读写一个字符(文本操作)) 相关博文:C ...

  7. C语言之文件读写探究(二):fputc、fgetc、feof(一次读写一个字符(文本操作))

    相关博文:C语言之文件读写探究(一):fopen.fclose(文件的打开和关闭) 相关博文:C语言之文件读写探究(二):fputc.fgetc.feof(一次读写一个字符(文本操作)) 相关博文:C ...

  8. C语言之文件读写探究(一):fopen、fclose(文件的打开和关闭)

    相关博文:C语言之文件读写探究(一):fopen.fclose(文件的打开和关闭) 相关博文:C语言之文件读写探究(二):fputc.fgetc.feof(一次读写一个字符(文本操作)) 相关博文:C ...

  9. php中文件读写总结,PHP中文件读写操作

    PHP中文件读写操作 PHP中提供了一系列的I/O函数,能简捷地实现我们所需要的功能,包括文件系统操作和目录操作(如"复制[copy]").下面给大家介绍的是基本的文件读写操作:( ...

最新文章

  1. 关于ExtJS在使用下拉列表框的二级联动获取数据
  2. 快速解决mongodb出现id重复问题
  3. 属于android动画的是什么,下列选项中,属于Android系统的补间动画的是( )
  4. Linux 解压缩tar经历,Linux命令 -- tar解压缩命令
  5. VTK:网格之OBBDicer
  6. Unreal Engine 4添加自定义Settings到项目设置
  7. 拓端tecdat|R语言动量交易策略分析调整后的数据
  8. LINUX不能恢复式安装
  9. 自动驾驶 6-4 高级转向控制 - MPC Advanced Steering Control - MPC
  10. 常用键盘对应keyascii码
  11. 无盘服务器 免费,免费无广告的网咖专用云无盘安装图文教程
  12. 车载Android导航系统framework层面上的系统修改问题汇总
  13. Android真正的静默安装
  14. python长度单位转化_所有长度单位的换算
  15. 优盘中发现计算机病毒怎么办,电脑u盘中病毒exe文件怎么办
  16. Tasker Android系统增强神器,Android系统增强神器 Tasker
  17. 不打开Excel文件读取工作表名(ADOX)
  18. 毕业设计 -- 微信小程序选题大全(一)
  19. Docker 入坑指南
  20. 南京外企100万,杭州阿里p8 150万,怎么选?

热门文章

  1. ansbile--playbook剧本案例
  2. 10个 Linux/Unix下 Bash 和 KSH shell 的作业控制实例
  3. PostgreSQL学习手册(二) 模式(Schema)
  4. LInux 字符设备驱动程序
  5. xgboost keras_用catboost lgbm xgboost和keras预测财务交易
  6. 869. 重新排序得到 2 的幂
  7. 1713. 得到子序列的最少操作次数
  8. 上海区块链会议演讲ppt_进行第一次会议演讲的完整指南
  9. git 代理 git_如何成为Git专家
  10. laravel 检测sql_在Laravel PHP应用程序中轻松进行面部检测