【发布时间】: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