当涉及到C++ I/O操作时,我非常缺乏经验,特别是在处理缓冲区等方面,所以请容忍我。
我有一个程序,它有一个物体向量(1000 s-10,000)。在每个时间步骤,对象的状态被更新。我希望拥有记录每个对象的完整状态时间历史的功能。
目前,我有一个函数,它循环遍历对象向量,更新状态,然后调用一个日志函数,它为该对象打开文件(ascii),将状态写入文件,并关闭文件(使用std::ofstream)。问题是这个显着地减慢了我的运行时间。
有人建议我做几件事情来加快速度:
我的问题主要涉及1.具体来说,我如何落实这一点?每个对象会有效地需要它自己的缓冲区吗?或者,这是一个单独的缓冲区,以某种方式知道发送每个数据位的文件?如果是后者,实现这一目标的最佳途径是什么?
谢谢!
发布于 2020-01-22 11:10:04
也许首先最简单的想法是:为什么不将所有内容记录到SQLite数据库中,而不是记录到单独的文件中
鉴于以下表格结构:
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的数据库管理器轻松地查询每个单独对象的历史记录。
https://stackoverflow.com/questions/59857157
复制相似问题