linux – 在Golang中读取文件时如何跳过文件系统缓存?

linux – 在Golang中读取文件时如何跳过文件系统缓存?,第1张

概述假设文件Foo.txt的内容如下. Foo Bar Bar Foo 考虑以下简短程序. package mainimport "syscall"import "fmt"func main() { fd, err := syscall.Open("Foo.txt", syscall.O_RDONLY, 0) if err != nil { fmt.Prin 假设文件Foo.txt的内容如下.
Foo bar bar Foo

考虑以下简短程序.

package mainimport "syscall"import "fmt"func main() {    fd,err := syscall.Open("Foo.txt",syscall.O_RDONLY,0)    if err != nil {        fmt.Println("Failed on open: ",err)    }    data := make([]byte,100)    _,err = syscall.Read(fd,data)    if err != nil {        fmt.Println("Failed on read: ",err)    }    syscall.Close(fd)}

当我们运行上面的程序时,我们没有错误,这是正确的行为.

现在,我将syscall.Open行修改为以下内容.

fd,syscall.O_RDONLY | syscall.O_SYNC | syscall.O_DIRECT,0)

当我再次运行程序时,我得到以下(不合需要的)输出.

Failed on read:  invalID argument

如何正确传递open man page指定的标志syscall.O_SYNC和syscall.O_DIRECT以跳过文件系统缓存

请注意,我直接使用syscall文件接口而不是os文件接口,因为我找不到将这些标志传递给os提供的函数的方法,但我对使用os的解决方案持开放态度,前提是它们正常​​工作以禁用读取时的文件系统缓存.

另请注意,我在Ubuntu 14.04上运行,ext4作为我的文件系统.

更新:我尝试在下面的代码中使用@Nick Craig-Wood的软件包.

package mainimport "io"import "github.com/ncw/directio" import "os"import "fmt"func main() {    in,err := directio.Openfile("Foo.txt",os.O_RDONLY,0666)    if err != nil {        fmt.Println("Error on open: ",err)    }    block := directio.AlignedBlock(directio.BlockSize)    _,err = io.ReadFull(in,block)    if err != nil {        fmt.Println("Error on read: ",err)    }}

输出如下

Error on read:  unexpected EOF
解决方法 您可能会喜欢我为此制作的 directio package.

来自网站

这是Go语言的库,可以在Go的所有支持的 *** 作系统下使用Direct IO(openbsd和plan9除外).

直接IO在磁盘上执行IO,而不在OS中缓冲数据.当您正在阅读或编写大量您不想填充 *** 作系统缓存的数据时,它非常有用.

请参阅此处了解包文档

http://go.pkgdoc.org/github.com/ncw/directio

总结

以上是内存溢出为你收集整理的linux – 在Golang中读取文件时如何跳过文件系统缓存?全部内容,希望文章能够帮你解决linux – 在Golang中读取文件时如何跳过文件系统缓存?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/yw/1033185.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存