【问题标题】:How to buffer efficiently when writing to 1000s of files in C++在 C++ 中写入 1000 个文件时如何有效地缓冲
【发布时间】:2020-01-22 10:06:23
【问题描述】:

我对 C++ I/O 操作非常缺乏经验,尤其是在处理缓冲区等方面,所以请多多包涵。

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

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

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

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

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

谢谢!

【问题讨论】:

  • 每次登录时不要打开和关闭文件。看看它会把你带到哪里。您可能需要更改打开文件限制以保持 1000 个文件同时打开。
  • 您能说明一下您的要求吗?每个对象的“状态”分别有多大?对于整个系统?你可以批量写入吗?您是否允许将世界状态记录在一个文件而不是数千个文件中?是否允许将计算和输出分离到不同的线程中?
  • 尽量避免经常打开和关闭文件。打开每个对象的文件并保持打开状态。看看你从中获得了多少性能。
  • @Botje 当然——每个对象的状态占用一个 288 字节的字符串——这对所有对象都是一样的。从理论上讲,我可以将所有内容的状态放入一个文件中,但以后必须进行某种类型的后处理步骤才能将它们分开。线程可能是一种选择。你能澄清一下批量写入是什么意思吗?
  • 每N次迭代只写入文件,这对应于你的“缓冲想法”

标签: c++ file ubuntu io output-buffering


【解决方案1】:

也许首先是最简单的想法:与其记录到单独的文件,不如将所有内容记录到SQLite database

给定以下表结构:

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 的数据库管理器轻松查询每个单独对象的历史记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 2015-04-10
    • 1970-01-01
    相关资源
    最近更新 更多