【发布时间】:2020-01-22 10:06:23
【问题描述】:
我对 C++ I/O 操作非常缺乏经验,尤其是在处理缓冲区等方面,所以请多多包涵。
我有一个包含对象向量(1000s - 10,000s)的程序。在每个时间步,对象的状态都会更新。我希望能够为每个对象记录完整的状态时间历史记录。
目前我有一个函数循环遍历我的对象向量,更新状态,然后调用一个日志函数,该函数打开该对象的文件(ascii),将状态写入文件,然后关闭文件(使用 std ::流)。问题是这显着减慢了我的运行时间。
有人建议我做几件事来帮助加快速度:
- 缓冲我的输出以防止对磁盘的大量 I/O 调用
- 写入二进制而不是 ascii 文件
我的问题主要涉及 1. 具体来说,我将如何实际实现这一点?每个对象会有效地需要它自己的缓冲区吗?或者这将是一个以某种方式知道要发送每一位数据的文件的单个缓冲区吗?如果是后者,实现这一目标的最佳方法是什么?
谢谢!
【问题讨论】:
-
每次登录时不要打开和关闭文件。看看它会把你带到哪里。您可能需要更改打开文件限制以保持 1000 个文件同时打开。
-
您能说明一下您的要求吗?每个对象的“状态”分别有多大?对于整个系统?你可以批量写入吗?您是否允许将世界状态记录在一个文件而不是数千个文件中?是否允许将计算和输出分离到不同的线程中?
-
尽量避免经常打开和关闭文件。打开每个对象的文件并保持打开状态。看看你从中获得了多少性能。
-
@Botje 当然——每个对象的状态占用一个 288 字节的字符串——这对所有对象都是一样的。从理论上讲,我可以将所有内容的状态放入一个文件中,但以后必须进行某种类型的后处理步骤才能将它们分开。线程可能是一种选择。你能澄清一下批量写入是什么意思吗?
-
每N次迭代只写入文件,这对应于你的“缓冲想法”
标签: c++ file ubuntu io output-buffering