[在C ++中写入1000个文件时如何有效缓冲

问题描述 投票:1回答:1

关于C ++ I / O操作,特别是在处理缓冲区等方面,我经验不足,所以请多多包涵。

我有一个包含对象向量的程序(1000s-10,000s)。在每个时间步,对象的状态都会更新。我想具有为每个对象记录完整状态时间历史记录的功能。

[当前,我有一个循环遍历我的对象向量,更新状态,然后调用日志记录功能的函数,该函数打开该对象的文件(ascii),将状态写入文件,然后关闭文件(使用std: :ofstream)。问题是这明显地减慢了我的运行时间。

已建议我做一些事情来帮助加快速度:

  1. 缓冲我的输出以防止对磁盘进行广泛的I / O调用
  2. 写入二进制而不是ASCII文件

我的问题主要涉及1.具体来说,我将如何实际实施?每个对象都会有效地需要自己的缓冲区吗?还是这是一个缓冲区,以某种方式知道发送每个数据位的文件?如果是后者,实现此目标的最佳方法是什么?

谢谢!

c++ file ubuntu io output-buffering
1个回答
0
投票
给出以下表格结构:

create table iterations ( id integer not null, iteration integer not null, value text not null );

在程序开始时,准备一次语句:

sqlite3_stmt *stmt;
sqlite3_prepare_v3(db, "insert into iterations values(?,?,?)", -1, SQLITE_PREPARE_PERSISTENT, &stmt, NULL);

这里的问号是将来值的占位符。

在模拟的每次迭代之后,您可以遍历状态向量并执行stmt多次,以将行实际插入数据库中,如下所示:

for (int i = 0; i < objects.size(); i++) { sqlite3_reset(stmt); // Fill in the three placeholders and execute the query. sqlite3_bind_int(stmt, 1, i); sqlite3_bind_int(stmt, 2, current_iteration); // Could be done once, but here for illustration. std::string state = objects[i].get_state(); sqlite3_bind_text(stmt, 3, state.c_str(), state.size(), SQLITE_STATIC); // SQLITE_STATIC means "no need to free this" sqlite3_step(stmt); // Execute the query. }

然后,您可以使用SQLite命令行工具或任何了解SQLite的数据库管理器轻松查询每个对象的历史记录。

© www.soinside.com 2019 - 2024. All rights reserved.