Gunosy.go#2 package/compress

Gunosy.go#2 package/compress

6e8d1cd646b7cc589fdd5bdea0fd9bf1?s=128

shunsukeaihara

June 19, 2014
Tweet

Transcript

  1. Gunosy.go#2   package/compress Shunsuke  Aihara  

  2. compress  is  ... •  http://golang.org/pkg/compress/ •  いわゆる圧縮ファイルを扱うもの –  なんか⾒見見てみたらGoで全部書いてある – 

    libzlibとかに依存せずgoで完結してる •  複数の圧縮ファイルフォーマットに対応 –  bzip2 –  zlib –  gzip –  lzw
  3. 実装されている圧縮アルゴリズム •  bzip2 –  Bw変換を⽤用いた圧縮アルゴリズム。 –  遅いが圧縮率率率が⾼高い •  flate(bzip,  zlib)

    –  zipで⽤用いられている圧縮アルゴリズム(Deflate) –  LZ77  +  ハフマン符号 •  lzw –  deflateと⽐比べると⾼高速だが圧縮効率率率が若若⼲干悪い –  LZ78の改良良アルゴリズム。gifで使われていて昔 特許で騒がれたアレ
  4. •  bzip2 –  Bw変換を⽤用いた圧縮アルゴリズム。 –  遅いが圧縮率率率が⾼高い •  flate(bzip,  zlib) – 

    zipで⽤用いられている圧縮アルゴリズム(Deflate) –  LZ77  +  ハフマン符号 •  lzw –  deflateと⽐比べると⾼高速だが圧縮効率率率が若若⼲干悪い –  LZ78の改良良アルゴリズム。gifで使われていて昔 特許で騒がれたアレ 実装されている圧縮アルゴリズム 圧縮アルゴリズムは共通で、ファイル形式のみ異異なる
  5. アルゴリズムについて詳しくは… •  ⾼高速⽂文字列列解析の世界を読みましょう!   •  h9p://www.amazon.co.jp/dp/4000069748

  6. compress/*の使い⽅方 •  基本的な使い⽅方はどれも同じ   – 圧縮ファイルを扱う際は…   •  NewReaderで圧縮ファイル読み込み⽤用Reader作成   – 

    物によっては辞書や圧縮オプションを指定可能(ただし圧 縮時に利利⽤用した物を指定しないとerror)   •  NewWriterで圧縮ファイル作成⽤用Writer作成   –  ものによって辞書(LZ77⽅方式で利利⽤用する初期⽂文脈?)と圧縮 オプションを指定可能   – Bzip2は伸張のみサポート   – 微妙にIFが異異なる   •  Exampleがあるzlibから紹介   •  h9p://play.golang.org/p/GH6_Mtoaek  
  7. compress/zlib •  func  NewReader(r  io.Reader)  (io.ReadCloser,  error)   •  func

     NewReaderDict(r  io.Reader,  dict  []byte)  (io.ReadCloser,  error)   •  type  Writer   –  func  NewWriter(w  io.Writer)  *Writer   –  func  NewWriterLevel(w  io.Writer,  level  int)  (*Writer,  error)   –  func  NewWriterLevelDict(w  io.Writer,  level  int,  dict  []byte)  (*Writer,   error)   –  func  (z  *Writer)  Close()  error   –  func  (z  *Writer)  Flush()  error   –  func  (z  *Writer)  Reset(w  io.Writer)   –  func  (z  *Writer)  Write(p  []byte)  (n  int,  err  error)   •  その他、圧縮オプションに関する定数値、エラー型を定義   •  中でflateを呼んでいる  
  8. 解凍時の処理理 •  h9p://golang.org/pkg/compress/zlib/#example_NewReader

  9. 圧縮時の処理理 •  h9p://golang.org/pkg/compress/zlib/#example_NewWriter

  10. compress/flate •  func  NewReader(r  io.Reader)  io.ReadCloser   •  func  NewReaderDict(r

     io.Reader,  dict  []byte)  io.ReadCloser   •  type  CorruptInputError   –   func  (e  CorruptInputError)  Error()  string   •  type  InternalError   –  func  (e  InternalError)  Error()  string   •  type  ReadError   –  func  (e  *ReadError)  Error()  string   •  type  Reader   •  type  WriteError   –  func  (e  *WriteError)  Error()  string   •  type  Writer   –  func  NewWriter(w  io.Writer,  level  int)  (*Writer,  error)   –  func  NewWriterDict(w  io.Writer,  level  int,  dict  []byte)  (*Writer,  error)   –  func  (w  *Writer)  Close()  error   –  func  (w  *Writer)  Flush()  error   –  func  (w  *Writer)  Reset(dst  io.Writer)   –  func  (w  *Writer)  Write(data  []byte)  (n  int,  err  error)   •  その他、圧縮オプションに関する定数値、エラー型を定義  
  11. compress/gzip •  type  Header   •  type  Reader   – 

    func  NewReader(r  io.Reader)  (*Reader,  error)   –  func  (z  *Reader)  Close()  error   –  func  (z  *Reader)  Read(p  []byte)  (n  int,  err  error)   •  type  Writer   –  func  NewWriter(w  io.Writer)  *Writer   –  func  NewWriterLevel(w  io.Writer,  level  int)  (*Writer,  error)   –  func  (z  *Writer)  Close()  error   –  func  (z  *Writer)  Flush()  error   –  func  (z  *Writer)  Reset(w  io.Writer)   –  func  (z  *Writer)  Write(p  []byte)  (int,  error)   •  その他、圧縮オプションに関する定数値、エラー型を定義   •  gzipは独⾃自のヘッダ型がある   •  中でflateを呼んでいる  
  12. compress/bzip2 •  func  NewReader(r  io.Reader)  io.Reader   •  type  StructuralError

      – func  (s  StructuralError)  Error()  string   •  Block  sort(BW変換)のgo実装読んでみた かったけど圧縮は未対応だった  
  13. compress/lzw •  func  NewReader(r  io.Reader,  order  Order,   litWidth  int)

     io.ReadCloser   •  func  NewWriter(w  io.Writer,  order  Order,   litWidth  int)  io.WriteCloser   •  type  Order