syscall.Mmap を使用して Go でメモリ マッピングを実装し、ファイルをメモリに直接マッピングして読み取りおよび書き込み速度を向上させます。この関数は、マップされた領域を表すバイト スライスを返し、読み取りおよび書き込みアクセスを許可し、ファイルとの変更を共有します。実際の例で示されているように、syscall.Munmap を使用してマッピングを解除すると、読み取りおよび書き込みのパフォーマンスが向上します。メモリ マッピングは、従来の読み取り方法よりもはるかに高速です。
Golang でメモリ マッピングを使用してファイルの読み取りおよび書き込み速度を向上させる方法
はじめに
メモリ マッピングは、プログラムがファイルをメモリに直接マップできるようにするファイル アクセス テクノロジであり、これにより従来のパフォーマンスの低下を回避できます。読み取りおよび書き込み操作によって発生するオーバーヘッド。 Golang では、syscall.Mmap
関数を使用してメモリ マッピングを実装できます。 syscall.Mmap
函数实现内存映射。
代码
以下是如何在 Golang 中使用内存映射读写文件的示例代码:
package main import ( "os" "syscall" "unsafe" ) func main() { // 打开文件 f, err := os.Open("/tmp/test.txt") if err != nil { panic(err) } defer f.Close() // 获取文件大小 fi, err := f.Stat() if err != nil { panic(err) } // 创建映射区域 b, err := syscall.Mmap(int(f.Fd()), 0, int(fi.Size()), syscall.PROT_READ|syscall.PROT_WRITE, syscall.MAP_SHARED) if err != nil { panic(err) } // 数据操作 s := []byte(string(b)) // 您可以对 s 进行读写操作,修改将同步到文件 // 取消映射 err = syscall.Munmap(b) if err != nil { panic(err) } }
注意:
syscall.Mmap
函数将返回一个字节切片,代表映射区域。syscall.PROT_READ
和 syscall.PROT_WRITE
分别允许读和写访问。syscall.MAP_SHARED
指定映射区域与文件共享,因此对映射区域的修改将反映到文件中。syscall.Munmap
これは、Golang でメモリ マッピングを使用してファイルを読み書きする方法のサンプル コードです:
package main import ( "fmt" "os" "syscall" "time" ) func main() { const fileSize = 100 * 1024 * 1024 // 100MB const loopCount = 100 // 创建大文件 f, err := os.Create("/tmp/test.txt") if err != nil { panic(err) } _, err = f.Write(make([]byte, fileSize)) if err != nil { panic(err) } f.Close() // 使用内存映射和传统方法比较读写时间 compareTime("mmap", func() { for i := 0; i < loopCount; i++ { b := memoryMap("/tmp/test.txt") count := int(fileSize / 1024) for j := 0; j < count; j++ { _ = string(b[j*1024 : (j+1)*1024]) } syscall.Munmap(b) } }) compareTime("read", func() { for i := 0; i < loopCount; i++ { b, err := os.ReadFile("/tmp/test.txt") if err != nil { panic(err) } count := int(fileSize / 1024) for j := 0; j < count; j++ { _ = string(b[j*1024 : (j+1)*1024]) } } }) } // 使用 syscall.Mmap 获取文件映射区域 func memoryMap(file string) []byte { f, err := os.Open(file) if err != nil { panic(err) } defer f.Close() fi, err := f.Stat() if err != nil { panic(err) } b, err := syscall.Mmap(int(f.Fd()), 0, int(fi.Size()), syscall.PROT_READ, syscall.MAP_SHARED) if err != nil { panic(err) } return b } // 比较函数执行时间 func compareTime(name string, f func()) { start := time.Now() f() elapsed := time.Since(start) fmt.Printf("%s: %v\n", name, elapsed) }注:
syscall.Mmap
関数マップされた領域を表すバイトのスライスが返されます。 🎜syscall.PROT_READ
と syscall.PROT_WRITE
では、それぞれ読み取りアクセスと書き込みアクセスが許可されます。 🎜syscall.MAP_SHARED
は、マップされた領域がファイルと共有されることを指定するため、マップされた領域への変更はファイルに反映されます。 🎜syscall.Munmap
を使用して、マップされた領域のマップを解除してください。 🎜🎜🎜🎜実際のケース🎜🎜🎜大きなファイルを作成し、メモリ マッピングを使用してデータをすばやく読み書きしてみましょう: 🎜rrreee🎜上記のコードを実行すると、メモリ マッピング方法が従来の読み取り方法よりも大幅に高速であることがわかります。 🎜以上がGolang でのファイルの読み取りおよび書き込み速度を向上させるためにメモリ マッピングを使用する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。