Potential workaround for poor zstd performance
Performance is still not great, but better
This commit is contained in:
@@ -40,6 +40,7 @@ type outDat struct {
|
||||
func (r FullReader) process(index int, offset int64, out chan outDat) {
|
||||
var err error
|
||||
var dat []byte
|
||||
var rdr io.ReadCloser
|
||||
size := realSize(r.sizes[index])
|
||||
if size == 0 {
|
||||
out <- outDat{
|
||||
@@ -49,12 +50,24 @@ func (r FullReader) process(index int, offset int64, out chan outDat) {
|
||||
}
|
||||
return
|
||||
}
|
||||
rdr := io.LimitReader(toreader.NewReader(r.r, offset), int64(size))
|
||||
// rdr := io.LimitReader(toreader.NewReader(r.r, offset), int64(size))
|
||||
if size == r.sizes[index] {
|
||||
rdr, err = r.d.Reader(rdr)
|
||||
}
|
||||
if err == nil {
|
||||
dat, err = io.ReadAll(rdr)
|
||||
//Special workaround for zstd for increased performancce.
|
||||
if zstd, ok := r.d.(*decompress.Zstd); ok {
|
||||
dat = make([]byte, size)
|
||||
_, err = r.r.ReadAt(dat, offset)
|
||||
if err == nil {
|
||||
dat, err = zstd.Decode(dat)
|
||||
}
|
||||
} else {
|
||||
rdr, err = r.d.Reader(io.LimitReader(toreader.NewReader(r.r, offset), int64(size)))
|
||||
if err == nil {
|
||||
dat, err = io.ReadAll(rdr)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
dat = make([]byte, size)
|
||||
_, err = r.r.ReadAt(dat, offset)
|
||||
}
|
||||
out <- outDat{
|
||||
i: index,
|
||||
|
||||
+22
-7
@@ -12,17 +12,20 @@ type Reader struct {
|
||||
cur io.Reader
|
||||
fragRdr io.Reader
|
||||
d decompress.Decompressor
|
||||
comRdr io.Reader
|
||||
blockSizes []uint32
|
||||
blockSize uint32
|
||||
resetable bool
|
||||
}
|
||||
|
||||
func NewReader(r io.Reader, d decompress.Decompressor, blockSizes []uint32, blockSize uint32) *Reader {
|
||||
var out Reader
|
||||
out.d = d
|
||||
out.master = r
|
||||
out.blockSizes = blockSizes
|
||||
out.blockSize = blockSize
|
||||
return &out
|
||||
return &Reader{
|
||||
d: d,
|
||||
master: r,
|
||||
blockSizes: blockSizes,
|
||||
blockSize: blockSize,
|
||||
resetable: true,
|
||||
}
|
||||
}
|
||||
|
||||
func (r *Reader) AddFragment(rdr io.Reader) {
|
||||
@@ -50,7 +53,19 @@ func (r *Reader) advance() (err error) {
|
||||
} else {
|
||||
r.cur = io.LimitReader(r.master, int64(size))
|
||||
if size == r.blockSizes[0] {
|
||||
r.cur, err = r.d.Reader(r.cur)
|
||||
if r.d.Resetable() {
|
||||
if r.comRdr == nil {
|
||||
r.cur, err = r.d.Reader(r.cur)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
} else {
|
||||
err = r.d.Reset(r.comRdr, r.cur)
|
||||
r.cur = r.comRdr
|
||||
}
|
||||
} else {
|
||||
r.cur, err = r.d.Reader(r.cur)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user