【问题标题】:multiple buffered input streams from single file while writing to that file?写入该文件时来自单个文件的多个缓冲输入流?
【发布时间】:2013-09-10 04:20:24
【问题描述】:

我正在处理一个排序问题,该问题涉及对大于主内存的文件进行排序。第一阶段生成一个中间文件,其大小与原始输入文件相同,但包含一些本地排序的子节。

第二阶段将这些子部分合并回一个排序列表。

我不想创建第三个文件来包含单个排序列表,而是想覆盖我正在读取的中间文件因为我正在从中读取

此外,我想为每个输入流维护单独的读取缓冲区(每个都从某个偏移量读取到中间文件中)。

我知道我可以使用 fopen() 和 fseek() 创建多个缓冲的只读输入流。但是,fopen() 的合约规定,在“w”模式下对文件调用它会将文件的大小设置为零,如果它已经存在的话。我需要它来不改变文件的大小,因为我仍在多个地方读取它。

是否有使用 fopen() 和 fseek() 的简单方法来完成此操作?还是我需要使用 open() 并管理我自己的读/写缓冲?

【问题讨论】:

  • 覆盖中间文件会很复杂。考虑您按faebdc 顺序输入小节的情况,但内容没有任何重叠。由于更少的 I/O 和相当线性的访问模式,为每个子部分使用临时文件通常会更快。将mmap() 用于源数据通常会更好,并且不需要任何额外的临时文件。

标签: c linux unix fopen


【解决方案1】:

你可以在r+模式下打开文件,这意味着它可以读写,并且不会截断文件。

【讨论】:

    【解决方案2】:

    我首先建议您通过写入第三个文件来让您的程序运行。然后,如果条件要求您就地更新文件,则创建一个可以运行的“简单”程序的副本并对其进行修改。

    这样,当您测试您的新程序时,您就可以将它与之前的有效结果进行比较。也就是说,最终简单程序和新程序都应该生成相同的排序文件。

    【讨论】:

    • @ash 它质疑这个问题。如果迈出了第一步,分析师可能会意识到更困难的第二步没有必要。
    【解决方案3】:

    阅读fopen(3) 手册页。您可能想要"r+" 模式。

    或者,考虑使用 mmap(2)madvise(2) 系统调用(不带任何 <stdio.h> 函数)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2023-03-31
      • 1970-01-01
      相关资源
      最近更新 更多