在C中提高文件IO的性能

时间:2014-08-29 21:50:37

标签: c performance file file-io io

我需要在对文件执行堆操作之后逐个将大量的整数写入文件。我试图将排序的文件合并到一个文件中。截至目前,我正在每次操作后写入文件。我正在使用min heap来合并文件。

我的问题是 -

  1. 执行文件写入时,每次写入文件或一次写入多块内存块时是否访问磁盘?

  2. 如果我在一个大小为1024的数组中输出堆,或者可能更多,然后立即执行写操作,它会改善性能吗?

  3. 提前谢谢。

    编辑 - 使用setbuffer()会有帮助吗?我觉得它应该有所帮助。

3 个答案:

答案 0 :(得分:1)

1. When performing file write, is disk accessed every time a file write is made 
or chunks of memory blocks are written at a time?

没有。在输出缓冲区已满之前,不会写入输出。您可以强制使用fflush进行写入以刷新输出流,从而导致立即写入,否则,输出将被缓冲。

other 1. Will it improve performance if I'll take output of heap in an array of 
say size 1024 or may be more and then perform a write at once?

如果你没有耗尽堆,那么不,你不会获得显着的性能将存储放在堆栈上等。缓冲总是首选,但如果你将所有数据存储在一个数组然后调用写,你仍然有相同大小的输出缓冲区来处理。

答案 1 :(得分:1)

  

执行文件写入时,每次写入文件时都会访问磁盘   是一次写入或块内存块?

这取决于内核。在文件描述符上调用fsync()时刷新缓冲区。 fflush()仅刷新FILE结构中缓冲的数据,它不会刷新内核缓冲区。

  

如果我将在一个数组中输出堆,它会改善性能吗?   说大小1024或者可能更多,然后立即执行写入?

我前段时间做过测试,将write()fwrite()的效果与自定义实施进行比较,事实证明,通过直接调用write()可以获得更快的加速效果块。这实际上是fwrite()的作用,但由于它必须维护的基础设施,它比自定义实现慢。至于缓冲区大小,1024肯定是太小了。 8K或其他什么表现会更好。

答案 2 :(得分:0)

这是操作系统和具体实现。

在大多数Linux系统上 - 使用像Ext4这样的好文件系统 - 内核会通过缓存大量文件系统数据来尽量避免磁盘访问。见linuxatemyram

但我仍然建议避免进行过多的IO操作,并进行一些缓冲(如果使用stdio(3)例程,将几十千字节的缓冲区传递到fwrite(3)并使用setvbuf(3)fflush(3)小心;或者使用直接系统调用,如write(2)mmap(2),缓冲区为例如64K字节......)

BTW,使用posix_fadvise(2)系统调用可能会略微帮助提高性能(如果明智地使用)。

实际上,瓶颈通常是硬件。如果可以,请使用RAM文件系统(tmpfs)或快速SSD磁盘。

在Windows系统上(我从未使用过),我不知道,但一般的直觉是一些缓冲应该有所帮助。