ในการนำเข้า bpool จากซอร์สโค้ดใช้คำสั่ง get
ไปรับ -u github.com/unit-io/bpool
ใช้พูลบัฟเฟอร์สำหรับการเขียนคำขอเข้ามาเพื่อบัฟเฟอร์เช่นการดำเนินการวางหรือแบทช์หรือใช้พูลบัฟเฟอร์ในขณะที่เขียนข้อมูลไปยังไฟล์บันทึก (ระหว่างการดำเนินการคอมมิชชัน) วัตถุประสงค์ของการสร้างไลบรารี bufferpool ที่มีความจุคือการเขียนเริ่มต้นเพื่อบัฟเฟอร์โดยไม่ต้องย้อนกลับจนกว่าพูลบัฟเฟอร์ถึงขนาดเป้าหมาย Buffer Pool ไม่ได้ยกเลิกคำขอรับหรือเขียนใด ๆ แต่จะเพิ่มความล่าช้าอย่างค่อยเป็นค่อยไปเพื่อ จำกัด การใช้หน่วยความจำที่สามารถใช้สำหรับการดำเนินการอื่น ๆ เช่นการเขียนเพื่อบันทึกหรือการซิงค์ DB
เอกสาร API โดยละเอียดมีให้บริการโดยใช้บริการ Godoc.org
ใช้ประโยชน์จากไคลเอนต์โดยนำเข้าในซอร์สโค้ดไคลเอนต์ GO ของคุณ ตัวอย่างเช่น,
นำเข้า "github.com/unit-io/bpool"
การติดตามรหัสตัวอย่างหากดำเนินการโดยไม่มีความจุบัฟเฟอร์จะใช้หน่วยความจำระบบทั้งหมดและจะทำให้เกิดความตื่นตระหนก
buf := bytes.NewBuffer(make([]byte, 0, 2))
defer func() {
if r := recover(); r != nil {
fmt.Println("panics from blast")
}
}()
for {
_, err := buf.Write([]byte("create blast"))
if err != nil {
fmt.Println(err.Error())
return
}
}
โค้ดตัวอย่างเพื่อใช้ bufferPool ที่มีความจุจะ จำกัด การใช้หน่วยความจำระบบโดยการเพิ่มความล่าช้าอย่างค่อยเป็นค่อยไปในคำขอและจะไม่ทำให้เกิดความตื่นตระหนก
pool := bpool.NewBufferPool(1<<20, &bpool.Options{MaxElapsedTime: 1 * time.Minute, WriteBackOff: true}) // creates BufferPool of 16MB target size
buf := pool.Get()
defer pool.Put(buf)
for {
_, err := buf.Write([]byte("create blast"))
if err != nil {
fmt.Println(err.Error())
return
}
}
ใช้วิธี bpool.newbufferpool () และผ่านพารามิเตอร์บัฟเฟอร์เพื่อสร้างพูลบัฟเฟอร์ใหม่
const (
BufferSize = 1<<30 // (1GB size)
)
pool := bpool.NewBufferPool(BufferSize, nil)
ในการรับบัฟเฟอร์จาก Buffer Pool ให้ใช้ bufferpool.get () เมื่อพูลบัฟเฟอร์ถึงความจุได้วิธีการทำงานด้วยความล่าช้าอย่างค่อยเป็นค่อยไปเพื่อ จำกัด การใช้หน่วยความจำระบบ
....
var buffer *bpool.Buffer
buffer = pool.Get()
ในการเขียนไปยังบัฟเฟอร์ใช้วิธีการบัฟเฟอร์ WWRITE ()
var scratch [8]byte
binary.LittleEndian.PutUint64(scratch[0:8], uint64(buffer.Size()))
b.buffer.Write(scratch[:])
....
ในการอ่านบัฟเฟอร์ใช้วิธีการบัฟเฟอร์ bytes () การดำเนินการนี้จะส่งคืนตัวชิ้นข้อมูลขีดเส้นใต้ที่เก็บไว้ในบัฟเฟอร์
data := buffer.Bytes()
...
ในการใส่บัฟเฟอร์ไปยังพูลเมื่อเสร็จสิ้นการใช้บัฟเฟอร์ใช้วิธี BufferPool.put () การดำเนินการนี้จะรีเซ็ตชิ้นขีดเส้นใต้ นอกจากนี้ยังรีเซ็ตช่วงเวลาพูลบัฟเฟอร์ที่ใช้เพื่อชะลอการดำเนินการรับหากความจุต่ำกว่าขนาดเป้าหมาย
pool.Put(buffer)
...
ในการรีเซ็ตชิ้นส่วนขีดเส้นใต้ที่เก็บไว้ในบัฟเฟอร์และดำเนินการต่อโดยใช้วิธีการบัฟเฟอร์ใช้บัฟเฟอร์ Reset () แทนที่จะใช้การดำเนินการ bufferPool.put ()
buffer.Reset()
....
หากคุณต้องการมีส่วนร่วมโปรดแยกที่เก็บและใช้สาขาฟีเจอร์ ยินดีต้อนรับคำขอดึง
โครงการนี้ได้รับใบอนุญาตภายใต้ใบอนุญาต MIT