0

我正在开发一个需要编写数百个 ASCII 文件的 C++ 程序。这些文件几乎相同。特别是,文件的大小始终完全相同,它们之间只有几个字符不同。

为此,我目前正在使用 fopen 上的 for 循环打开 N 个文件,然后为每个数据块(每隔几个字符)在每个文件上调用 fputc/fwrite。这似乎可行,但感觉应该有一些更有效的方法。

我可以做些什么来减少文件系统的负载和/或提高速度吗?例如,保持数百个文件打开并一点一点地写入所有文件对文件系统的负担有多大?打开一个文件,完全写入一个文件,关闭它,然后再继续下一个文件会更好吗?

4

4 回答 4

1

您可以只向一个文件写入一次,然后复制该文件。您可以在此处阅读有关如何制作副本的信息

这是来自上部链接的示例代码如何在 C++ 中执行此操作:

int main() {
    String* path = S"c:\\temp\\MyTest.txt";
    String* path2 = String::Concat(path, S"temp");

    // Ensure that the target does not exist.
    File::Delete(path2);

    // Copy the file.
    File::Copy(path, path2);
    Console::WriteLine(S"{0} copied to {1}", path, path2);
return 0;
}
于 2013-07-04T12:27:43.343 回答
1

如果您考虑执行任何这些系统调用通常涉及的上下文切换的成本,那么是的,您应该“背负”尽可能多的数据,同时考虑到写入时间和缓冲区的长度。

考虑到这主要是一个 io 驱动的问题,可能是一个 pub sub 架构,其中发布者缓冲数据,以便您提供给任何执行 io 工作的订阅者(并且还等待底层存储机制准备好)可能是一个不错的选择。

于 2013-07-04T12:21:16.370 回答
1

如果不对您的特定系统进行基准测试,我会猜测——这可能是你能得到的最好的——一次写入一个文件比打开丢失的文件并将数据写入多个文件要好。毕竟,在内存中准备数据是一个小细节,写入文件是一个“漫长的过程”。

于 2013-07-04T12:30:53.990 回答
0

我现在已经做了一些测试,似乎至少在我的系统上,并行写入所有文件比一个接一个地写入它们慢大约 60%(100 个文件乘以 100000000 个字符为 263 秒与 165 秒)。

我也尝试使用 ofstream 代替 fputc,但 fputc 似乎快两倍。

最后,我可能会继续做我目前正在做的事情,因为重写我的代码以一次写入一个文件的复杂性不值得提高性能。

于 2013-07-05T10:33:05.423 回答