在矢量 c++ 中加载大数据

Loading Large Data in Vector c++

本文关键字:加载 数据 c++      更新时间:2023-10-16

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

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

如果您的平台允许 - 它可能允许 - 尝试将整个文件读取到单个内存缓冲区中,然后从缓冲区读取到矢量中。

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

无论你使用文件 I/O(如 UNIX 的 read(2( 系统调用(,还是映射(在 *NIX 上的 mmap(2(,我不记得 Windows 等效项叫什么了(,你都会避免大量的系统调用。 我希望 getline 本身会做一些缓冲,但缓冲不会那么大。