我有大量制表符分隔的平面文件表。我想在更快的时间内加载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
答案 0 :(得分:1)
如果你的平台允许它 - 它可能会 - 尝试将整个文件读入单个内存缓冲区,然后从缓冲区读入载体。
如果您的平台具有内存映射 - Linux,BSD,Mac OS X和Windows都可以 - 它更快,并且使用更少的内存来存储映射文件而不是使用文件I / O系统调用。
无论是使用文件I / O(如UNIX&#39; read(2)系统调用),还是映射(* NIX上的mmap(2),我都不记得Windows等价物的名称),你会避免很多系统调用。我希望getline自己做一些缓冲,但缓冲不会那么大。