'file.sync()'可以用来关闭文件吗?

Can `file.sync()` be used for closing the file?

提问人:Amit 提问时间:6/13/2023 最后编辑:Amit 更新时间:6/13/2023 访问量:191

问:

我正在编写 Go 中文件 IO 操作的基准测试。

我想在执行简单的 IO 操作(如创建、打开、读取、写入、删除文件)时避免任何操作系统级别的异步或缓存。

从这个 SO 问题中:何时在 Go 中刷新文件?我知道,简单的写作是不够的,因为它不能保证完成实际的磁盘操作。

因此,我将代码更改为

start := time.Now()
_, e = file.Write(b)
if e == nil {
    e = file.Sync()
}
elapsed := time.Since(start)

我假设这将负责写入操作。

对于“创建”、“读取”和“打开”操作,我凭直觉认为,如果相关操作完成时没有任何错误,则将执行实际的磁盘操作。如果错了,请在这里纠正我的理解。

我关心的是关闭和删除文件。

我检查了这个 安全关闭 golang 中的文件描述符,但在我的上下文中没有多大意义

目前,我的文件关闭代码如下所示

start := time.Now()
e = file.Close()
elapsed := time.Since(start)

我正在用于删除文件。os.Remove(fileName)

我还可以考虑关闭/删除操作的可能的操作系统级别异步,以及当程序调用关闭/删除文件时,文件实例将被标记为关闭或删除,并且实际的磁盘操作将在操作系统决定时完成。

方法可以帮助关闭文件吗?sync

有什么更好的方法来保证文件正在删除(没有太大的开销 - 比如文件在删除后立即存在循环)

Go IO 基准测试

评论

4赞 Peter 6/13/2023
如果在上次写入和关闭之间同步,则关闭根本不是磁盘操作。它只是释放一些内核资源,并使文件描述符可供重用。Sync 是否实际提交到硬件取决于硬件。例如,某些磁盘具有写入缓存。您可能可以在数据库空间中找到一些有关此的好信息。这些人不得不经常担心这种事情。
2赞 Peter 6/13/2023
在 Close 调用中没有要同步的内容。它只是告诉内核“这个过程是用这个文件描述符完成的”。Delete 本质上是异步的(即在 *nix 上;我对 Windows 的了解还不够多,无法与之交谈)。例如,如果有其他文件描述符,它不会在磁盘上执行任何操作。但您可以确保,在 Remove 不返回错误后,无法创建新的文件描述符。
1赞 kostix 6/13/2023
«我想在执行简单的 IO 操作时避免任何操作系统级别的异步或缓存» 我可能误解了您的需求(看起来英语不是您的母语),但如果您想击败操作系统完成的所有缓存,您必须使用所谓的“直接”文件访问,这需要使用标志打开文件, 以及使用页面对齐和大小的块执行 I/O。也就是说,您的初始前提似乎不太正确。O_DIRECT
1赞 kostix 6/13/2023
请注意,当涉及文件系统层时,文件删除与读取和写入并没有太大区别。如果你想确保在FS级别上删除,你必须打开目录的文件描述器(当我们谈论Linux时,不确定Windows和NTFS)。尽管如此,这并不能保证该操作实际上已经更改了文件系统底层介质上的相关位。内核根本没有标准化的方法来解决这个问题。fsync
1赞 Volker 6/13/2023
“我正在编写 Go 中文件 IO 操作的基准测试。”这是一项_incredible复杂的任务。这在 80 年代是微不足道的,在 90 年代很难,在今天几乎是不可能的。“不可能”是指:“不可能从这种具有太多活动部件的测量中获得可操作的数字和学习”。

答: 暂无答案