第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

在 Golang 中讀取文件時(shí)如何跳過(guò)文件系統(tǒng)緩存?

在 Golang 中讀取文件時(shí)如何跳過(guò)文件系統(tǒng)緩存?

Go
慕運(yùn)維8079593 2021-11-15 16:06:50
假設(shè)文件內(nèi)容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)}當(dāng)我們運(yùn)行上面的程序時(shí),我們沒有得到任何錯(cuò)誤,這是正確的行為?,F(xiàn)在,我將該syscall.Open行修改為以下內(nèi)容。fd, err := syscall.Open("Foo.txt", syscall.O_RDONLY | syscall.O_SYNC | syscall.O_DIRECT, 0)當(dāng)我再次運(yùn)行程序時(shí),我得到以下(不需要的)輸出。Failed on read:  invalid argument如何正確傳遞標(biāo)志syscall.O_SYNC并syscall.O_DIRECT按照open手冊(cè)頁(yè)的指定跳過(guò)文件系統(tǒng)緩存?請(qǐng)注意,我syscall直接使用文件接口而不是os文件接口,因?yàn)槲艺也坏綄⑦@些標(biāo)志傳遞給 提供的函數(shù)的方法os,但我對(duì)使用的解決方案持開放態(tài)度,os前提是它們可以正常工作以禁用讀。還要注意,我正在上Ubuntu 14.04與ext4我的文件系統(tǒng)。更新:我嘗試在下面的代碼中使用@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
查看完整描述

3 回答

?
呼啦一陣風(fēng)

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超6個(gè)贊

您可能會(huì)喜歡我為此目的制作的directio 包。

從網(wǎng)站

這是 Go 語(yǔ)言的庫(kù),可以在所有支持的 Go 操作系統(tǒng)(openbsd 和 plan9 除外)下使用 Direct IO。

直接 IO 執(zhí)行與磁盤的 IO 操作,而無(wú)需在操作系統(tǒng)中緩沖數(shù)據(jù)。當(dāng)您正在讀取或?qū)懭氪罅坎幌胩顫M操作系統(tǒng)緩存的數(shù)據(jù)時(shí),它很有用。

請(qǐng)參閱此處獲取軟件包文檔

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


查看完整回答
反對(duì) 回復(fù) 2021-11-15
?
FFIVE

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊

open手冊(cè)頁(yè),在 NOTES 下:

O_DIRECT 標(biāo)志可能會(huì)對(duì)用戶空間緩沖區(qū)的長(zhǎng)度和地址以及 I/O 的文件偏移量施加對(duì)齊限制。在 Linux 中,對(duì)齊限制因文件系統(tǒng)和內(nèi)核版本而異,并且可能完全不存在。

因此,您可能會(huì)遇到內(nèi)存或文件偏移量的對(duì)齊問題,或者您的緩沖區(qū)大小可能“錯(cuò)誤”。對(duì)齊方式和大小應(yīng)該是什么并不明顯。手冊(cè)頁(yè)繼續(xù):

然而,目前沒有獨(dú)立于文件系統(tǒng)的接口供應(yīng)用程序發(fā)現(xiàn)給定文件或文件系統(tǒng)的這些限制。

甚至 Linus 也以他一貫低調(diào)的方式表示:

“關(guān)于 O_DIRECT 一直困擾我的事情是整個(gè)界面只是愚蠢的,并且可能是由瘋狂的猴子在一些嚴(yán)重的精神控制物質(zhì)上設(shè)計(jì)的?!?nbsp;——萊納斯

祝你好運(yùn)!

ps 暗中刺痛:為什么不讀取 512 字節(jié)?


查看完整回答
反對(duì) 回復(fù) 2021-11-15
?
神不在的星期二

TA貢獻(xiàn)1963條經(jīng)驗(yàn) 獲得超6個(gè)贊

您可以嘗試使用 fadvice 和 madvice,但不能保證。兩者都更可能適用于更大的文件/數(shù)據(jù),因?yàn)椋?/p>


部分頁(yè)面是故意保留的,因?yàn)槠谕A粜枰膬?nèi)存比丟棄不需要的內(nèi)存要好。


查看 linux 源代碼,什么會(huì)做什么,什么不會(huì)。例如 POSIX_FADV_NOREUSE 不做任何事情。


http://lxr.free-electrons.com/source/mm/fadvise.c#L62


http://lxr.free-electrons.com/source/mm/madvise.c


package main


import "fmt"

import "os"

import "syscall"


import "golang.org/x/sys/unix"


func main() {

    advise := false

    if len(os.Args) > 1 && os.Args[1] == "-x" {

        fmt.Println("setting file advise")

        advise =true

    }


    data := make([]byte, 100)

    handler, err := os.Open("Foo.txt")

    if err != nil {

        fmt.Println("Failed on open: ", err)

    }; defer handler.Close()


    if advise {

        unix.Fadvise(int(handler.Fd()), 0, 0, 4) // 4 == POSIX_FADV_DONTNEED

    }


    read, err := handler.Read(data)

    if err != nil {

        fmt.Println("Failed on read: ", err)

        os.Exit(1)

    }


    if advise {

        syscall.Madvise(data, 4) // 4 == MADV_DONTNEED

    }


    fmt.Printf("read %v bytes\n", read)

}

/usr/bin/time -v ./direct -x


Command being timed: "./direct -x"

User time (seconds): 0.00

System time (seconds): 0.00

Percent of CPU this job got: 0%

Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.03

Average shared text size (kbytes): 0

Average unshared data size (kbytes): 0

Average stack size (kbytes): 0

Average total size (kbytes): 0

Maximum resident set size (kbytes): 1832

Average resident set size (kbytes): 0

Major (requiring I/O) page faults: 2

Minor (reclaiming a frame) page faults: 149

Voluntary context switches: 2

Involuntary context switches: 2

Swaps: 0

File system inputs: 200

File system outputs: 0

Socket messages sent: 0

Socket messages received: 0

Signals delivered: 0

Page size (bytes): 4096

Exit status: 0


查看完整回答
反對(duì) 回復(fù) 2021-11-15
  • 3 回答
  • 0 關(guān)注
  • 361 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)