【发布时间】:2013-09-10 04:20:24
【问题描述】:
我正在处理一个排序问题,该问题涉及对大于主内存的文件进行排序。第一阶段生成一个中间文件,其大小与原始输入文件相同,但包含一些本地排序的子节。
第二阶段将这些子部分合并回一个排序列表。
我不想创建第三个文件来包含单个排序列表,而是想覆盖我正在读取的中间文件因为我正在从中读取。
此外,我想为每个输入流维护单独的读取缓冲区(每个都从某个偏移量读取到中间文件中)。
我知道我可以使用 fopen() 和 fseek() 创建多个缓冲的只读输入流。但是,fopen() 的合约规定,在“w”模式下对文件调用它会将文件的大小设置为零,如果它已经存在的话。我需要它来不改变文件的大小,因为我仍在多个地方读取它。
是否有使用 fopen() 和 fseek() 的简单方法来完成此操作?还是我需要使用 open() 并管理我自己的读/写缓冲?
【问题讨论】:
-
覆盖中间文件会很复杂。考虑您按
faebdc顺序输入小节的情况,但内容没有任何重叠。由于更少的 I/O 和相当线性的访问模式,为每个子部分使用临时文件通常会更快。将mmap()用于源数据通常会更好,并且不需要任何额外的临时文件。