最近实现了一个文件格式API,并且想知道为什么文件大小直到close()
才更新。进行了一些搜索,发现内容被写入缓冲区,直到调用close()
。我想看看是否可以在调用写操作时更新文件大小,因此我抛出了一个flush()
调用,但除非调用os.fsync()
,否则什么也做不了
对于API来说,速度就是一切。用os.fsync()
调用flush()
速度较慢,因为现在正在进行磁盘写入。事实证明,它的速度慢了近2倍,因此使用缓冲区并等待close()
会更好。但是,其中一些文件可能会变得相当大,需要考虑内存。出于这个原因,我本以为将缓冲区清除到磁盘是最好的,直到我注意到~4GB缓冲区甚至没有出现在内存中。我在监视编写4GB文件的过程,内存使用从未增加;事实上,总体记忆从未增加。监视磁盘显示在调用close()
之前发生的写操作,但操作系统不知道文件大小增加了
那么,在写入磁盘之前,这些缓冲区在哪里存储这些信息呢
编辑:
通过进一步研究,我发现了以下几点:
io.DEFAULT_BUFFER_SIZE
是8192字节我不熟悉这个级别的文件I/o,但我猜当内部缓冲区被填满时,它会“传输”到操作系统的缓冲区,然后写入磁盘。但是,即使文件已写入磁盘,操作系统也不会更新其文件视图(即文件大小/属性),直到流关闭
目前没有回答
相关问题 更多 >
编程相关推荐