提高C中文件IO的性能
在对大量整数执行堆操作后,我需要逐个将它们写入文件。我正在尝试将已排序的文件合并到单个文件中。到目前为止,每次操作后我都会向文件中写入内容。我正在使用最小堆合并文件 我的问题是-提高C中文件IO的性能,c,performance,file,file-io,io,C,Performance,File,File Io,Io,在对大量整数执行堆操作后,我需要逐个将它们写入文件。我正在尝试将已排序的文件合并到单个文件中。到目前为止,每次操作后我都会向文件中写入内容。我正在使用最小堆合并文件 我的问题是- 执行文件写入时,是否每次写入文件或一次写入内存块块时都会访问磁盘 若我将堆的输出放在一个大小为1024或更多的数组中,然后立即执行写操作,那个么它会提高性能吗 先谢谢你 编辑-使用setbuffer()会有帮助吗?我觉得它在一定程度上应该有所帮助。它是操作系统和具体实现的 在大多数Linux系统上——有一个很好的文件系
编辑-使用setbuffer()会有帮助吗?我觉得它在一定程度上应该有所帮助。它是操作系统和具体实现的 在大多数Linux系统上——有一个很好的文件系统,如Ext4——内核将通过缓存大量文件系统数据来努力避免磁盘访问。看 但我仍然建议避免过多的IO操作,并使用一些缓冲(如果使用例程,则将几十KB的缓冲区传递给并小心使用;或者使用直接系统调用,例如64KB的缓冲区…) 顺便说一句,如果使用得当,使用系统调用可能会略微提高性能 实际上,瓶颈往往是硬件。如果可以,请使用RAM文件系统(
tmpfs
)或快速SSD磁盘
在Windows系统上(我从未使用过),我不知道,但一般的直觉是一些缓冲应该会有所帮助
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?
如果您没有耗尽堆,那么不,将存储放在堆栈上不会获得显著的性能,等等。。缓冲始终是首选,但如果将所有数据存储在一个数组中,然后调用write,则仍需要处理相同大小的输出缓冲
执行文件写入时,是否每次文件写入时都会访问磁盘
一次写入一块或多块内存块
这取决于内核。在文件描述符上调用fsync()
时,会刷新缓冲区fflush()
只刷新文件
结构中缓冲的数据,不刷新内核缓冲区
如果我将堆的输出放在一个数组中,它会提高性能吗
说出大小1024或更大,然后立即执行写入
不久前,我做了一些测试,将
write()
和fwrite()
的性能与自定义实现进行比较,结果表明,直接使用大块调用write()
可以获得相当的加速。这实际上就是fwrite()
所做的,但是由于它必须维护的基础结构,它比自定义实现慢。至于缓冲区大小,1024肯定太小了。8K或其他什么性能会更好。您实际拥有多少数据。兆字节(那就不重要了)或千兆字节(那就重要了,你需要进行基准测试)。到目前为止,我尝试过的最坏情况是在200000个文件中分布10 GB左右的数据。在哪个操作系统上,哪个文件系统,哪个硬件,什么类型的磁盘(SSD?),多少RAM?这是一台笔记本电脑。Linux、4GB ram、SATA HDD、ext4、core 2 duo处理器。您是否考虑过mmap文件,我总是使用mmap和memcpyGood来获得更好的性能。请注意,这也取决于您使用的C库,而不仅仅是内核缓冲的工作方式