【问题标题】:(efficiently) Writing Identical Data to Multiple Files in C(有效地)在 C 中将相同的数据写入多个文件
【发布时间】:2017-10-08 17:34:59
【问题描述】:

我遇到了一种情况,我必须将一些字符串写入多个文件。一个直接的解决方案是简单地遍历每个文件,分别将相同的数据写入每个文件。如果想同时将相同的数据写入多个文件流,他们将如何有效地实现这一目标?虽然这种情况是假设的,但一个示例可能是 - 如果想同时写入 FILE*stdout 流:

FILE* streams[] = { /* some file streams */ };

/* is there a more efficient or elegant approach? */
int i;
for (i = 0; i < sizeof(streams); i++) 
    fputs(/* data */, streams[i]);

虽然此示例显示仅写入 2 个目标流,但潜在的解决方案应该能够写入多达 8 个文件流。为了实现这一点,是否可以链接文件以使它们指向同一位置?在没有实用方法镜像文件写入的情况下,如果可以将文件写入操作卸载到不同的线程,请不要发布。

提前致谢。

【问题讨论】:

  • 文件系统中的文件通常不共享“公共块”——因为在文件流下,磁盘仍然面向块工作。因此,除非你发明一个新的文件系统,否则我认为没有捷径可以编写一次并将块链接到许多文件。使用多个线程写入同一个磁盘也不会对您有太大帮助,因为写入最有可能被序列化(互斥)。多个线程可能会为您带来一些好处,但我认为这不太可能。
  • 为什么不写入文件一次,然后使用文件系统和操作系统复制文件。我相信他们会以最优化的方式编写。
  • 您需要尝试多线程或异步写入。一般来说,在微调器上有多个未完成的 IO 请求(硬盘驱动程序可以优化磁头移动)、多个驱动器和/或网络驱动器将提高整体性能。真的,你必须尝试一下:)
  • 给所有方法加时间戳,看看哪个最快。

标签: c multithreading file io


【解决方案1】:

如果想同时将相同的数据写入多个文件流,他们将如何有效地实现这一目标?

我猜循环是唯一的选择。

为了实现这一点,是否可以链接文件以使它们指向同一位置?

如果您的 N 个文件需要相同,请确保您可以只写入一个文件并创建指向该文件的硬链接。请注意,并非所有文件系统都支持硬链接,对其中一个文件的任何更改都会同时更改所有文件,因为它基本上是同一个文件:

ln orig_file copy1

可以将文件写入操作卸载到不同的线程

当然,线程将有助于提高性能,但您的几行程序会变得更长。尝试增加下面的缓冲区:

man setvbuf

【讨论】:

  • 如果我将该逻辑包装到一个函数中,而不是将数据直接放入流中 - 将其推送到 char 缓冲区的队列(数组)中。然后专用一个线程来不断写入将最顶部的缓冲区放入其目标文件中。这会更有效吗?请记住,我在多线程方面没有受过多少教育。
  • 视情况而定。您可以从应用程序中榨取更多性能,直到您完全确定瓶颈是您的应用程序。但实际上你的旧硬盘可能是这里真正的问题。因此,如果您只是为了好玩而学习多线程 - 去吧。如果您期望两个线程上的性能会翻倍——不,很可能不会。监控您的磁盘负载以做出合理的决定。按照 cmets 中的建议查看异步 I/O (man aio)。或者什么也不做,拥有一个简单而强大的应用程序,性能合理......
猜你喜欢
  • 1970-01-01
  • 2018-03-24
  • 1970-01-01
  • 2018-08-05
  • 2016-11-25
  • 1970-01-01
  • 2018-06-29
  • 2014-10-12
  • 2020-05-18
相关资源
最近更新 更多