从文本文件快速解析数据

时间:2014-05-17 20:56:11

标签: c++ file parsing optimization

我将一个完整的文件读入一个字符串。这很快。 (例如180Mb文件 - 2s) 然后我使用>>从字符串中提取一些值。运算符并从中创建多个数组,并将数组插入到结构中,并将每个结构添加到向量中。

我正试图找到瓶颈,因为这很慢(但也许你什么都做不了)

  1. 是>>快速接近?

    string str; // gets filled with the file
    struct A;
    std::vector<A> b; // global variables
    // in the function inside the loop 
    str >> a.val
    A a;
    b.push_back(a);
    
  2. 向量是否取得a的所有权或是否复制了?还在堆栈上吗?我有大约60.000个结构插入到向量中。这是一种快速的方法还是更好的方法。

2 个答案:

答案 0 :(得分:3)

问题是&gt;&gt;快速接近?

答案快速是相对的。你把它与什么比较?

问题该向量是否取得a的所有权或是否制作副本?

答案 std::vector::push_back()制作输入对象的副本。

问题还在堆栈中吗?

回答仅根据发布的代码判断,是的,Ab都在堆栈中。

Queston 我有大约60,000个结构插入到向量中。这是一种快速的方法还是有更好的方法?

回答您可以通过创建具有所需大小的b并将数据直接读入b中的对象来获得一些性能。

std::vector<A> b(60000);
for ( i = 0; ; ++i /* Use whatever looping construct you can */ )
{
   str >> b[i].val;
}

<强>更新

如果能够,以二进制形式编写和读取数据将是最快的。使用std::ostream::write()写入数据,使用std::istream::read()读取数据。

答案 1 :(得分:2)

C I / O通常比C ++ I / O更快。尝试使用fscanf()解析数据块(请参阅:http://www.cplusplus.com/reference/cstdio/fscanf/),您可能会发现C方法运行得更快。