我需要在对文件执行堆操作之后逐个将大量的整数写入文件。我试图将排序的文件合并到一个文件中。截至目前,我正在每次操作后写入文件。我正在使用min heap来合并文件。
我的问题是 -
执行文件写入时,每次写入文件或一次写入多块内存块时是否访问磁盘?
如果我在一个大小为1024的数组中输出堆,或者可能更多,然后立即执行写操作,它会改善性能吗?
提前谢谢。
编辑 - 使用setbuffer()会有帮助吗?我觉得它应该有所帮助。
答案 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系统上(我从未使用过),我不知道,但一般的直觉是一些缓冲应该有所帮助。