gpt4 book ai didi

c++ - 使用 cat 命令合并由多个线程创建的文件是否有效?

转载 作者:太空宇宙 更新时间:2023-11-03 10:45:05 25 4
gpt4 key购买 nike

我有一个多线程 C++11 程序,其中每个线程都会产生大量需要写入磁盘的数据。所有数据都需要写到一个文件中。目前,我使用互斥体来保护多个线程对文件的访问。我的 friend 建议我可以为每个线程使用一个文件,然后在最后使用 cat 命令将这些文件合并到一个文件中,该命令是使用 system() 从 C++ 代码完成的。
我在想,如果 cat 命令要从磁盘中读回所有数据,然后将其再次写入磁盘,但这次写入单个文件,它不会变得更好。我用谷歌搜索但找不到 cat 命令的实现细节。我可以知道它是如何工作的吗?它是否会加速整个过程?

编辑:事件的年表并不重要,文件内容也没有顺序限制。这两种方法都会执行我想要的。

最佳答案

如果您对文件的内容有一些排序或结构限制,您没有指定。通常情况是这样,所以我会这样对待它,但希望我的解决方案无论哪种方式都能奏效。

经典的程序化方法

想法是将写入磁盘的工作卸载到专用的 IO 线程,并有一个多个生产者/一个消费者队列来排队所有的写入命令。每个工作线程只需将其输出格式化为字符串并将其推回队列。 IO 线程将队列中的成批消息弹出到缓冲区中,并发出写入命令。

或者,您可以在消息中添加一个字段以指示哪个工作人员发出了写入命令,并在需要时让 IO 线程推送到不同的文件。

为了获得更好的性能,如果您的主机操作系统支持异步版本的 IO 系统原语(读/写),也很有趣。然后,IO 线程将能够监视多个并发 IO,并在一个 IO 终止时立即为操作系统提供新的 IO。

正如评论中所建议的那样,您必须监控 IO 线程的拥塞情况,并相应地调整工作线程的数量。基于“自然”反馈的机制是简单地使队列有界,工作人员将等待锁直到空间释放出来。这让您可以在进程生命周期的任何时候控制生成的数据量,这是内存受限场景中的一个重要点。

您的问题

至于this command line tool只需读取写入其输入 channel (通常为 stdin)的任何内容,并将其复制到其输出(stdout)。就这么简单,你可以清楚地看到与上面提倡的解决方案的相似之处。不同的是 cat 不理解文件内部结构(如果有的话),它只处理字节流,这意味着如果多个进程同时写入一个 cat输入没有同步,结果输出可能会完全混淆。另一个问题是 atomicity (或缺少)IO 原语。


注意:在某些系统上,有一个称为 fork 的简洁小功能。 ,这让您可以在单个文件中多路复用多个“独立”的数据流。如果您碰巧在支持该功能的平台上工作,您可以将所有数据流捆绑在一个文件中,但可以单独访问。

关于c++ - 使用 cat 命令合并由多个线程创建的文件是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24021738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com