在c ++高效存储上,刷新文件策略

时间:2014-03-13 17:06:49

标签: c++ performance c++11 stream flush

情况如下:c ++程序以常规方式无休止地生成数据。数据需要非常快速地存储在持久存储中,因此不会妨碍计算时间。无法知道将提前存储的数据量。 在阅读thisthis帖后,我最终会遵循这种天真的策略:

  1. 创建一个std::ofstream ofs
  2. 打开新文件ofs.open("path/file", std::ofstream::out | std::ofstream::app)
  3. 使用运算符<<
  4. 添加std :: string
  5. 关闭文件已终止ofs.close()
  6. 尽管如此,我仍然对以下内容感到困惑:

    1. 由于之后只能读取数据,是否可以使用二进制(ios::binary)文件存储?会更快吗?
    2. 我了解冲洗应该由std::ofstream自动完成,我可以安全地使用它吗?我应该注意对记忆有什么影响吗?我是否必须在某些方面优化std::ofstream(更改其大小?)?
    3. 我应该关注文件越来越大吗?我应该在某个时候关闭它并开一个新的吗?
    4. 使用std::string有一些缺点吗?是否有一些可以避免的隐藏转换?
    5. 使用std::ofstream::write()更有利吗?
    6. 感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

  
    

1.由于之后只能读取数据,是否可以使用二进制(ios :: binary)文件存储?会更快吗?

  

由于任何存储设备上的所有数据类型都是二进制告诉编译器保存它,因此将导致或多或少地优化保存0&amp; s; 1&#39;第这取决于......许多事情以及你将如何使用/阅读它。其中一些列在Writing a binary file in C++ very fast中。 当在高清存储时,代码的性能总是局限于特定HD的速度(这是普遍的事实)。

尝试给出一个&#34;确定性/帧&#34;对于你的问题,它们过于笼统,不能说明问题&#34;

答案 1 :(得分:1)

我可能没有回答你的直接问题,但请原谅我,如果我退后一步,请原谅。

如果我正确理解了这个问题,那么关注的是写入磁盘的时间过长会延迟无休止的数据生成

也许你可以只为写作分配一个线程,而在主线程上继续处理。

写入程序线程可以定期唤醒,以便向磁盘写入到目前为止生成的内容。

两个线程之间的通信可以是:

  1. 两个缓冲区(一个在生成发生时有效,一个冻结,准备在下一批中写入磁盘)
  2. 或由生产者插入并由消费者/作者删除的数据队列。