【问题标题】:Efficient way to write multiple file content into a single file将多个文件内容写入单个文件的有效方法
【发布时间】:2011-07-28 03:49:23
【问题描述】:

有 n 个大小不同的文件。我们如何有效地将所有文件的内容附加到一个文件中?

技术或算法会有帮助吗?基本上,我期望用 c 语言实现这一点的有效方法。

【问题讨论】:

  • “高效”是什么意思?最小磁盘 I/O?最小cpu负载?最小内存使用?最大并行化?还有什么?
  • @Ted Hopp 我最感兴趣的是时间和 CPU 使用率...
  • 查看 Matt Ball 的答案。

标签: c multithreading algorithm file pthreads


【解决方案1】:

从简单开始。多线程将引入显着的复杂性,并且不一定会使事情运行得更快。伪代码时间:

Create a new file "dest" in write-only mode.
For each file "source" you want to append:
    Open "source" in read-only mode
    For each line "L" in "source":
        Write "L" to "dest"
    Close "source"
Close "dest"

顺便说一句,使用简单的命令行 Linux 工具(cat 等)实现这一点非常简单(并且几乎是最佳的),尽管它不能完全移植到 Windows。单行示例:

for i in `find . -type f -name "*.txt"`; do cat $i >> result.out; done

(查找当前目录中的每个.txt文件并将其附加到result.out。)

【讨论】:

  • 这应该在 Windows 中做同样的事情(至少对于文本文件):FOR /R %i in (*.txt) DO TYPE %i >> result.out
  • 希望你有一个 SSD!
  • 为什么要在文本模式下逐行显示?
  • @ruslik 这是一个半武断的决定。首先,编写伪代码以逐行读取/写入比使用缓冲更简单(这在实际代码中更有意义)。
【解决方案2】:

查看所有文件的总大小。

然后分配一个该大小的输出文件,再次检查它们并将数据写入您的输出。

【讨论】:

  • 计算总文件大小有什么好处?
  • @Mark:这样你就可以为结果分配几个大块的空间,而不是不断地附加小块,迫使文件系统每次都为新块找到一个新的位置。
  • 酷,我不知道你可以告诉操作系统文件有多大,更不用说从 C 语言了。
  • @Mark: 是的...它不是标准库的一部分,但请参阅_chsize_s_filelengthi64,您可以将它们与_fileno 一起使用来获取/设置FILE*.
  • 或在 POSIX 系统上,truncate()ftruncate()
【解决方案3】:

由于我不知道文件的内容是什么或附加它们的目的,因此如果只是文本或其他内容,此解决方案可能不是最好的。但是,我可能会找到一个 zip 库来使用(许可或开源),然后将所有文件压缩到一个存档中。

zlib 看起来很有趣:http://www.zlib.net/

【讨论】:

    【解决方案4】:
    1. 获取每个文件的大小Sn,计算所有文件的总大小T
    2. 创建目标文件
    3. 使用mmap映射大小为T的dest文件,会得到指向memmap区域起始地址的指针P
    4. 将每个文件mmap到mem,并将每个数据按顺序复制到上面的区域。
    5. 之后,您将获得包含所有文件中所有数据的 dest 文件

    【讨论】:

      猜你喜欢
      • 2010-10-13
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 2022-11-25
      • 2013-03-08
      • 2011-04-24
      • 2022-11-14
      • 2011-06-06
      相关资源
      最近更新 更多