首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++中写入1000 s文件时如何有效地缓冲

在C++中写入1000 s文件时如何有效地缓冲
EN

Stack Overflow用户
提问于 2020-01-22 10:06:23
回答 1查看 108关注 0票数 1

当涉及到C++ I/O操作时,我非常缺乏经验,特别是在处理缓冲区等方面,所以请容忍我。

我有一个程序,它有一个物体向量(1000 s-10,000)。在每个时间步骤,对象的状态被更新。我希望拥有记录每个对象的完整状态时间历史的功能。

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

有人建议我做几件事情来加快速度:

  1. 缓冲输出以防止对磁盘的大量I/O调用
  2. 写入二进制文件而不是ascii文件

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

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2020-01-22 11:10:04

也许首先最简单的想法是:为什么不将所有内容记录到SQLite数据库中,而不是记录到单独的文件中

鉴于以下表格结构:

代码语言:javascript
复制
create table iterations (
    id integer not null,
    iteration integer not null,
    value text not null
);

在项目开始时,准备一次陈述:

代码语言:javascript
复制
sqlite3_stmt *stmt;
sqlite3_prepare_v3(db, "insert into iterations values(?,?,?)", -1, SQLITE_PREPARE_PERSISTENT, &stmt, NULL);

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

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

代码语言:javascript
复制
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的数据库管理器轻松地查询每个单独对象的历史记录。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59857157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档