【问题标题】:Is it better to constantly write to a file, or keep data in memory and write at the end? [closed]是不断写入文件更好,还是将数据保存在内存中并在最后写入? [关闭]
【发布时间】:2017-07-31 23:53:01
【问题描述】:

我正在编写一个测试套件,用于根据公开代码对我的算法进行计时。每次测试运行不到一秒,从小问题的非常快到大问题的约 900 毫秒不等。

我希望每次测试写一行,每行不超过 200 个字符。我需要打印两种算法所花费的时间、它们之间的错误以及用于产生问题的种子。我希望一次运行 2000 个测试,但这个数字也应该是灵活的。如有必要,我可以将它们分解成更小的运行。

我希望在一个会话中运行数千个测试,这可能需要几个小时。因此,如果在一批测试的中途发生任何事情,确保数据不会丢失至关重要。但是不断写入文件可能太慢了。

我正在尝试决定是否应该在每次测试后写入日志文件,或者将结果存储在内存中并仅在一批(例如 10 次测试)或所有测试结束时打印它们。这些不同的方法平均会产生多大的差异(速度)?

【问题讨论】:

  • “可能”太慢了——你试过了吗?处理这个问题的简单方法是写入缓冲区并将缓冲区写入文件,这就是 stdio 的工作方式。
  • 另外,这是 C++ 还是 C?
  • DeoxNa,你每次测试打印多少字节?有多少测试?如果没有一些更具体的数字,很难判断这一点,尽管正如 Ryan 所说,答案可能是“让 stdio 处理缓冲”。
  • @Ray 我希望每次测试写一行,每行不超过 200 个字符。我需要打印两种算法所花费的时间、它们之间的错误以及用于产生问题的种子。我希望一次运行 2000 个测试,但这个数字也应该是灵活的。如有必要,我可以将它们分解成更小的运行。
  • @Olaf 公平点。由于所有文件 I/O 都在主机上完成,我认为没有必要添加 cuda 标签。

标签: performance io


【解决方案1】:

我希望在一个会话中运行数千个测试,这可能需要几个小时。 因此,如果在一批测试的中途发生任何事情,确保数据不会丢失至关重要。但是不断写入文件可能会太慢。

我想你已经得到了答案。写入文件实际上并没有那么慢(如果您只写一两行来报告测试结果)。

编辑:我刚看到你的评论,你只想写200个字符,下面的就别管了。直接写吧。

如果您要编写大量文本,您可能希望在执行测试时创建另一个线程来处理所有写入。但是,我建议不要这样做,因为如果您的测试已经是多线程的或者也正在使用 I/O,它可能会减慢您的测试并弄乱您的结果。 (如果你不熟悉线程和线程之间的通信,也可能会带来很多问题。

通过阅读您的帖子,我可能还怀疑您对每次测试的时间安排感兴趣。如果是这种情况,您可能只想暂停计时器,写入文件,然后在每次测试之间恢复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-12
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 2011-08-07
    • 2018-05-06
    相关资源
    最近更新 更多