一个关于C++高效存储和将数据缓存到文件中的策略的问题

3
这是情况:一个C++程序以有规律的方式无限生成数据。需要快速将数据存储在持久存储中,以免影响计算时间。不可能事先知道要存储的数据量。
阅读了这篇这篇帖子之后,我最终采用了以下幼稚的策略:
  1. 创建一个std::ofstream ofs
  2. 打开一个新文件ofs.open("path/file", std::ofstream::out | std::ofstream::app)
  3. 使用运算符<<添加std::string
  4. 在终止时关闭文件ofs.close()
然而,我仍然对以下问题感到困惑:
  1. 由于数据只会在之后被读取,因此是否可以使用二进制(ios::binary)文件存储?这样会更快吗?
  2. 我已经理解std::ofstream应该自动刷新,那么我可以安全地使用它吗?是否有任何内存影响我应该注意?我是否需要优化std::ofstream(改变其大小)?
  3. 我应该担心文件越来越大吗?我需要在某个时候关闭它并打开一个新的吗?
  4. 使用std::string有一些缺点吗?是否可以避免一些隐藏的转换?
  5. 使用std::ofstream::write()是否更有优势?
感谢您的帮助。

大多数这样的问题都取决于您要在文件中插入什么内容... - Claudiordgz
@Claudiordgz,我不明白你的意思,为什么和如何我应该关心字符串中的字符? - leag
你询问了以二进制模式存储的好处,这取决于数据和搜索方式。如果你关心文件大小吗?这取决于你如何使用文件,你注入了什么,频率是多少?你还说字符串有缺点...数据将被存储为数据,再次读取时你必须解析成某些东西,再次解析成字符串取决于你需要数据做什么,也许你需要双精度浮点数作为该列的数据类型。结论是你应该始终关注字符,考虑到对某些人来说这些信息真的很有价值。 - Claudiordgz
我同意数据应根据其类型和未来的分析正确格式化,但在这种情况下,我不关心格式,它们只是需要以某种方式存储的字符串。 - leag
如果是这种情况的话:二进制文件的I/O操作速度更快,但是与存储大量数字相比,你不会看到非常明显的改善,只有一些改善,因为你的数据是字符串。二进制文件的大小会更小,但是对于人类来说,二进制文件将变得无法阅读。根据您的规格,这主要适用于您,但是二进制存储还有其他优点,但更相关于其他类型的数据,例如数字或对象。 - Claudiordgz
2个回答

2
由于在任何存储设备上的数据类型都是二进制的,告诉编译器保存它将导致0和1的更优化的保存。这取决于许多因素以及您之后如何使用/读取它。其中一些列在以C++非常快的速度编写二进制文件中。 当涉及到存储在硬盘上时,代码性能总是受限于特定硬盘的速度(这是一个广为人知的事实)。
尝试为您的问题提供“确定性/框架”,它们对于陈述为“问题”太笼统了。

我将对特定情况进行一些测试,然后尝试改进它们,谢谢! - leag

1
我可能没有直接回答你的问题,但请原谅我稍作退缩尝试。
如果我正确理解了问题,关注点在于写入磁盘所需的时间过长,会延迟无休止的数据生成。
也许您可以为写入分配一个线程,而处理则继续在主线程上进行。
写入线程可以在定期间隔后唤醒,将其已生成的内容写入磁盘。
两个线程之间的通信可以是:
1. 两个缓冲区(一个活动缓冲区用于生成,一个“冻结”缓冲区准备在下一批次写入磁盘) 2. 或者是生产者插入并由消费者/编写者删除的数据队列。

有趣的策略。如果生产者在队列/缓冲区中插入速度比写入者更快,那么这会是延迟还是增加内存消耗? - leag
是的,这当然可能发生。当最重要的是不引入延迟到_producer_工作(例如等待I/O)时,可以使用此策略。一个例子是当你是接收者时。事情应该被尺寸化,以便_writer_能够完成其工作...或者你应该提供一种信号返回减速时处于_overload_状态。 - jsantander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接