在Vector c ++中加载大数据

时间:2014-12-18 05:58:25

标签: c++ vector flat-file

我有大量制表符分隔的平面文件表。我想在更快的时间内加载2D矢量容器中的所有数据。我在下面给出了我的代码。我用Ofast,Os和O2 Complexities检查了我的代码。但是,用4列加载100,000条记录需要将近20秒。但我想在1秒内加载500,000条记录。我怎样才能实现它。 ?

typedef vector <string> record_t;
typedef vector <record_t> table_t;

fstream& operator >> ( fstream& ins, record_t& r_record )
  {

  r_record.clear();

  string s_line;
  getline( ins, s_line );

  stringstream ss( s_line );
  string s_field;
  while (getline( ss, s_field, '\t' ))
    {

        r_record.push_back( s_field );
    }


  return ins;
  }


fstream& operator >> ( fstream& ins, table_t& t_data )
  {

  t_data.clear();


  record_t r_record;
  while (ins >> r_record)
    {
    t_data.push_back( r_record );
    }


  return ins;  
  }

    fstream fs("somesamplefile.txt",ios::in);
    table_t table;
    fs>>table;

时差是:

Os      22.860000 Seconds
Ofast   21.320000 Seconds
O2      22.660000 Seconds

1 个答案:

答案 0 :(得分:1)

如果你的平台允许它 - 它可能会 - 尝试将整个文件读入单个内存缓冲区,然后从缓冲区读入载体。

如果您的平台具有内存映射 - Linux,BSD,Mac OS X和Windows都可以 - 它更快,并且使用更少的内存来存储映射文件而不是使用文件I / O系统调用。

无论是使用文件I / O(如UNIX&#39; read(2)系统调用),还是映射(* NIX上的mmap(2),我都不记得Windows等价物的名称),你会避免很多系统调用。我希望getline自己做一些缓冲,但缓冲不会那么大。