提高C中文件IO的性能

提高C中文件IO的性能,c,performance,file,file-io,io,C,Performance,File,File Io,Io,在对大量整数执行堆操作后,我需要逐个将它们写入文件。我正在尝试将已排序的文件合并到单个文件中。到目前为止,每次操作后我都会向文件中写入内容。我正在使用最小堆合并文件 我的问题是- 执行文件写入时,是否每次写入文件或一次写入内存块块时都会访问磁盘 若我将堆的输出放在一个大小为1024或更多的数组中,然后立即执行写操作,那个么它会提高性能吗 先谢谢你 编辑-使用setbuffer()会有帮助吗?我觉得它在一定程度上应该有所帮助。它是操作系统和具体实现的 在大多数Linux系统上——有一个很好的文件系

在对大量整数执行堆操作后,我需要逐个将它们写入文件。我正在尝试将已排序的文件合并到单个文件中。到目前为止,每次操作后我都会向文件中写入内容。我正在使用最小堆合并文件

我的问题是-

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

  • 若我将堆的输出放在一个大小为1024或更多的数组中,然后立即执行写操作,那个么它会提高性能吗

  • 先谢谢你


    编辑-使用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库,而不仅仅是内核缓冲的工作方式