在矢量 c++ 中加载大数据
Loading Large Data in Vector c++
我有大量制表符分隔的平面文件表。我想在更快的时间内将所有数据加载到 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 本身会做一些缓冲,但缓冲不会那么大。
相关文章:
- 使用ifstream从DAT文件加载数据
- SqlDataAdapter 未加载数据表 - C++
- C ,MySQL API加载数据本地
- 使用提升库在队列和堆栈数据结构上保存和加载数据时出错
- 使用 fstream 从文件加载数据
- 从文件加载数据
- 将错误处理添加到加载数据的函数(但有时还需要使用默认值)
- C#从文件加载数据并分类为数组
- 保存/加载C++数据时出错
- C++简体版链表,当我加载数据以创建链表并输入更多数据时,似乎存在差距
- 我无法加载数据文件,总是无法打开它
- 从C++模拟中保存和加载数据的有效方法
- 快板 5 加载数据文件
- 通过C++虚幻引擎改进加载数据
- 使用套接字从页面加载数据
- 创建缓冲区以加载数据时出错
- 使用 boost 序列化到磁盘后无法加载数据
- 从C++中的CSV文件读取和加载数据时出现问题
- 如何在运行时通过插件机制动态加载数据类型
- 保存和加载数据C++