diff options
| author | qieqieplus <admin@qieqie.me> | 2021-08-20 18:36:51 +0800 |
|---|---|---|
| committer | qieqieplus <admin@qieqie.me> | 2021-08-20 18:38:18 +0800 |
| commit | 7720533f84cc6589e07247b1391868b7222cc33d (patch) | |
| tree | c65515170a4f2e2d39bfd44385a46eb6eeb3dc05 /weed/util/compression_stream.go | |
| parent | 48f88f976879401009558ace060557d09279e1be (diff) | |
| download | seaweedfs-7720533f84cc6589e07247b1391868b7222cc33d.tar.xz seaweedfs-7720533f84cc6589e07247b1391868b7222cc33d.zip | |
reduce gzip allocation
Diffstat (limited to 'weed/util/compression_stream.go')
| -rw-r--r-- | weed/util/compression_stream.go | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/weed/util/compression_stream.go b/weed/util/compression_stream.go new file mode 100644 index 000000000..390100c80 --- /dev/null +++ b/weed/util/compression_stream.go @@ -0,0 +1,53 @@ +package util + +import ( + "compress/gzip" + "fmt" + "io" + "sync" +) + +var ( + gzipReaderPool = sync.Pool{ + New: func() interface{} { + return new(gzip.Reader) + //return gzip.NewReader() + }, + } + + gzipWriterPool = sync.Pool{ + New: func() interface{} { + w, _ := gzip.NewWriterLevel(nil, gzip.BestSpeed) + return w + }, + } +) + +func GzipStream(w io.Writer, r io.Reader) (int64, error) { + gw, ok := gzipWriterPool.Get().(*gzip.Writer) + if !ok { + return 0, fmt.Errorf("gzip: new writer error") + } + gw.Reset(w) + defer func() { + gw.Close() + gzipWriterPool.Put(gw) + }() + return io.Copy(gw, r) +} + +func GunzipStream(w io.Writer, r io.Reader) (int64, error) { + gr, ok := gzipReaderPool.Get().(*gzip.Reader) + if !ok { + return 0, fmt.Errorf("gzip: new reader error") + } + + if err := gr.Reset(r); err != nil { + return 0, err + } + defer func() { + gr.Close() + gzipReaderPool.Put(gr) + }() + return io.Copy(w, gr) +} |
