相关疑难解决方法(0)

在C++中有效地读取非常大的文本文件

我有一个非常大的文本文件(45GB).文本文件的每一行包含两个空格分隔的64位无符号整数,如下所示.

4624996948753406865 10214715013130414417

4305027007407867230 4569406367070518418

10817905656952544704 3697712211731468838 ......

我想读取文件并对数字执行一些操作.

我在C++中的代码:

void process_data(string str)
{
    vector<string> arr;
    boost::split(arr, str, boost::is_any_of(" \n"));
    do_some_operation(arr);
}

int main()
{
    unsigned long long int read_bytes = 45 * 1024 *1024;
    const char* fname = "input.txt";
    ifstream fin(fname, ios::in);
    char* memblock;

    while(!fin.eof())
    {
        memblock = new char[read_bytes];
        fin.read(memblock, read_bytes);
        string str(memblock);
        process_data(str);
        delete [] memblock;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我对c ++比较陌生.当我运行此代码时,我遇到了这些问题.

  1. 由于以字节读取文件,有时块的最后一行对应于原始文件中的未完成行("4624996948753406865 10214"而不是主文件的实际字符串"4624996948753406865 10214715013130414417").

  2. 这段代码运行得非常慢.在具有6GB RAM的64位Intel Core i7 920系统中运行一个块操作需要大约6秒.是否有任何可用于改善运行时的优化技术?

  3. 是否有必要在boost分割功能中包含"\n"和空白字符?

我已经阅读了关于C++中的mmap文件,但我不确定这是否是正确的方法.如果是,请附上一些链接.

c++ linux boost mmap external-sorting

11
推荐指数
1
解决办法
2万
查看次数

标签 统计

boost ×1

c++ ×1

external-sorting ×1

linux ×1

mmap ×1