Submit Search
Upload
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
•
57 likes
•
77,791 views
Atsushi KOMIYA
Follow
2012.9.30 の DSIRNLP #3 で発表した資料です。
Read less
Read more
Technology
Slideshow view
Report
Share
Slideshow view
Report
Share
1 of 93
Recommended
Redisの特徴と活用方法について
Redisの特徴と活用方法について
Yuji Otani
いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例
Fixstars Corporation
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjp
sonickun
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
Fixstars Corporation
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
mosa siru
いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門
Fixstars Corporation
カスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについて
alwei
Recommended
Redisの特徴と活用方法について
Redisの特徴と活用方法について
Yuji Otani
いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例
Fixstars Corporation
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjp
sonickun
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
Fixstars Corporation
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
mosa siru
いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門
Fixstars Corporation
カスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについて
alwei
できる!並列・並行プログラミング
できる!並列・並行プログラミング
Preferred Networks
プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
こわくない Git
こわくない Git
Kota Saito
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
naoki koyama
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
infinite_loop
初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!
Tetsutaro Watanabe
TLS, HTTP/2演習
TLS, HTTP/2演習
shigeki_ohtsu
DeNAの最新のマスタデータ管理システム Oyakata の全容
DeNAの最新のマスタデータ管理システム Oyakata の全容
sairoutine
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみた
MITSUNARI Shigeo
君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?
Teppei Sato
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
sairoutine
目grep入門 +解説
目grep入門 +解説
murachue
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
MITSUNARI Shigeo
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Hiro H.
暗号技術の実装と数学
暗号技術の実装と数学
MITSUNARI Shigeo
JVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニング
佑哉 廣岡
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
Etsuji Nakai
ACRiウェビナー:小野様ご講演資料
ACRiウェビナー:小野様ご講演資料
直久 住川
オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫
Yuta Imai
Code Reading at Security and Programming camp 2011
Code Reading at Security and Programming camp 2011
Hiro Yoshioka
Programming camp code reading
Programming camp code reading
Hiro Yoshioka
More Related Content
What's hot
できる!並列・並行プログラミング
できる!並列・並行プログラミング
Preferred Networks
プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
こわくない Git
こわくない Git
Kota Saito
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
naoki koyama
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
infinite_loop
初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!
Tetsutaro Watanabe
TLS, HTTP/2演習
TLS, HTTP/2演習
shigeki_ohtsu
DeNAの最新のマスタデータ管理システム Oyakata の全容
DeNAの最新のマスタデータ管理システム Oyakata の全容
sairoutine
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみた
MITSUNARI Shigeo
君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?
Teppei Sato
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
sairoutine
目grep入門 +解説
目grep入門 +解説
murachue
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
MITSUNARI Shigeo
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Hiro H.
暗号技術の実装と数学
暗号技術の実装と数学
MITSUNARI Shigeo
JVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニング
佑哉 廣岡
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
Etsuji Nakai
ACRiウェビナー:小野様ご講演資料
ACRiウェビナー:小野様ご講演資料
直久 住川
オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫
Yuta Imai
What's hot
(20)
できる!並列・並行プログラミング
できる!並列・並行プログラミング
プログラムを高速化する話
プログラムを高速化する話
こわくない Git
こわくない Git
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!
TLS, HTTP/2演習
TLS, HTTP/2演習
DeNAの最新のマスタデータ管理システム Oyakata の全容
DeNAの最新のマスタデータ管理システム Oyakata の全容
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみた
君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
目grep入門 +解説
目grep入門 +解説
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
暗号技術の実装と数学
暗号技術の実装と数学
JVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニング
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
ACRiウェビナー:小野様ご講演資料
ACRiウェビナー:小野様ご講演資料
オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫
Similar to DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
Code Reading at Security and Programming camp 2011
Code Reading at Security and Programming camp 2011
Hiro Yoshioka
Programming camp code reading
Programming camp code reading
Hiro Yoshioka
Deep learning Libs @twm
Deep learning Libs @twm
Yuta Kashino
HBaseを用いたグラフDB「Hornet」の設計と運用
HBaseを用いたグラフDB「Hornet」の設計と運用
Toshihiro Suzuki
CRF を使った Web 本文抽出
CRF を使った Web 本文抽出
Shuyo Nakatani
刊行記念セミナー「HBase徹底入門」
刊行記念セミナー「HBase徹底入門」
cyberagent
Hokkaido.cap#1 Wiresharkの使い方(基礎編)
Hokkaido.cap#1 Wiresharkの使い方(基礎編)
Panda Yamaki
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
m2ym
golang binary hacks
golang binary hacks
yaegashi
Logをs3とredshiftに格納する仕組み
Logをs3とredshiftに格納する仕組み
Ken Morishita
Cybozu Tech Conference 2016 バグの調べ方
Cybozu Tech Conference 2016 バグの調べ方
MITSUNARI Shigeo
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺
MITSUNARI Shigeo
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
Yahoo!デベロッパーネットワーク
HBase×Impalaで作るアドテク「GMOプライベートDMP」@HBaseMeetupTokyo2015Summer
HBase×Impalaで作るアドテク「GMOプライベートDMP」@HBaseMeetupTokyo2015Summer
Michio Katano
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Masahiro Wakame
高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応
marsee101
Google Perf Tools (tcmalloc) の使い方
Google Perf Tools (tcmalloc) の使い方
Kazuki Ohta
第9回ACRiウェビナー_日立/島田様ご講演資料
第9回ACRiウェビナー_日立/島田様ご講演資料
直久 住川
Programming Hive Reading #3
Programming Hive Reading #3
moai kids
Osc2008 Opensuse Moonlinx
Osc2008 Opensuse Moonlinx
Kazuhisa Hara
Similar to DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
(20)
Code Reading at Security and Programming camp 2011
Code Reading at Security and Programming camp 2011
Programming camp code reading
Programming camp code reading
Deep learning Libs @twm
Deep learning Libs @twm
HBaseを用いたグラフDB「Hornet」の設計と運用
HBaseを用いたグラフDB「Hornet」の設計と運用
CRF を使った Web 本文抽出
CRF を使った Web 本文抽出
刊行記念セミナー「HBase徹底入門」
刊行記念セミナー「HBase徹底入門」
Hokkaido.cap#1 Wiresharkの使い方(基礎編)
Hokkaido.cap#1 Wiresharkの使い方(基礎編)
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
golang binary hacks
golang binary hacks
Logをs3とredshiftに格納する仕組み
Logをs3とredshiftに格納する仕組み
Cybozu Tech Conference 2016 バグの調べ方
Cybozu Tech Conference 2016 バグの調べ方
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
HBase×Impalaで作るアドテク「GMOプライベートDMP」@HBaseMeetupTokyo2015Summer
HBase×Impalaで作るアドテク「GMOプライベートDMP」@HBaseMeetupTokyo2015Summer
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応
Google Perf Tools (tcmalloc) の使い方
Google Perf Tools (tcmalloc) の使い方
第9回ACRiウェビナー_日立/島田様ご講演資料
第9回ACRiウェビナー_日立/島田様ご講演資料
Programming Hive Reading #3
Programming Hive Reading #3
Osc2008 Opensuse Moonlinx
Osc2008 Opensuse Moonlinx
Recently uploaded
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
Ryo Sasaki
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
iPride Co., Ltd.
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
danielhu54
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
sugiuralab
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
Hiroki Ichikura
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
Toru Tamaki
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
Toru Tamaki
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
Toru Tamaki
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
taisei2219
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Yuma Ohgami
Recently uploaded
(10)
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
1.
LZ4 の 速さの秘密に 迫ってみる DSIRNLP #3
2012.9.30 KOMIYA Atsushi (@komiya_atsushi) 1
2.
Who ?
2
3.
KOMIYA Atsushi @komiya_atsushi
3
4.
分析力をコアとする 情報最適化企業
4
5.
でエンジニアやってます
5
6.
アルバート アルベルト でエンジニアやってます
6
7.
#TokyoWebmining
運営 7
8.
Agenda 1. What is
LZ4 ? 2. Dictionary compression 3. Why fast ? 4. Conclusion 8
9.
おことわり •LZ4 の •使い方の話はしません
•仕様の話もほとんどしません •速く処理をするための工夫にのみ着目 してお話しします 9
10.
What is LZ4
? 10
11.
What is LZ4
? URL : http://fastcompression.blogspot.jp/p/lz4.html http://code.google.com/p/lz4/ 11
12.
What is LZ4
? URL : http://fastcompression.blogspot.jp/p/lz4.html http://code.google.com/p/lz4/ 非常に高速な 圧縮アルゴリズム 12
13.
How fast ? •
snappy_unittest.cc に手を加えて計測 • テストデータ:enwik8 (http://mattmahoney.net/dc/textdata.html) 13
14.
How fast ? •
snappy_unittest.cc に手を加えて計測 • テストデータ:enwik8 (http://mattmahoney.net/dc/textdata.html) [MB/s] slow fast 14
15.
How fast ? •
snappy_unittest.cc に手を加えて計測 • テストデータ:enwik8 (http://mattmahoney.net/dc/textdata.html) vs. snappy x1.73 faster (comp.) x1.23 faster (decomp.) [MB/s] slow fast 15
16.
Compression ratio
[%] good bad 16
17.
Compression ratio
[%] good bad 速度重視の他ライブラリ(snappy / lzo)と 比較しても遜色ない圧縮率 17
18.
Dragon Quest X
and LZ4 18 引用元 (Gigazine):http://gigazine.net/news/20120824-dragonquest-backstage-cedec2012/
19.
Hadoop and LZ4
19 引用元 : https://issues.apache.org/jira/browse/HADOOP-7657
20.
… and some
features •Scalability : multi-threading •Support ARM processors •BSD License •Bindings •C# / Java / Python / Perl / JS / PHP / Ruby / LUA / Go / Haskell / Erlang 20
21.
Dictionary compression
21
22.
Dictionary compression •gzip (zlib)
などど同じスライド窓ベース の辞書式圧縮アルゴリズムを採用 22
23.
Dictionary compression •gzip (zlib)
などど同じスライド窓ベース の辞書式圧縮アルゴリズムを採用 23
24.
Dictionary compression •gzip (zlib)
などど同じスライド窓ベース の辞書式圧縮アルゴリズムを採用 【例】 おまえのものはおれのもの、おれのものもおれのもの 24
25.
Dictionary compression •gzip (zlib)
などど同じスライド窓ベース の辞書式圧縮アルゴリズムを採用 【例】 おまえのものはおれのもの、おれのものもおれのもの 原則として、1文字ずつ 左から右へ読み進める 25
26.
Dictionary compression •gzip (zlib)
などど同じスライド窓ベース の辞書式圧縮アルゴリズムを採用 【例】 おまえのものはおれのもの、おれのものもおれのもの いま着目している文字列(右側)が、 過去(左側)のどの場所にどの長さで 出現したのか? を求める 26
27.
Dictionary compression •gzip (zlib)
などど同じスライド窓ベース の辞書式圧縮アルゴリズムを採用 【例】 ここに着目 おまえのものはおれのもの、おれのものもおれのもの いま着目している文字列(右側)が、 過去(左側)のどの場所にどの長さで 出現したのか? を求める 27
28.
Dictionary compression •gzip (zlib)
などど同じスライド窓ベース の辞書式圧縮アルゴリズムを採用 【例】 ここに着目 おまえのものはおれのもの、おれのものもおれのもの いま着目している文字列(右側)が、 過去(左側)のどの場所にどの長さで 出現したのか? を求める 28
29.
Dictionary compression •gzip (zlib)
などど同じスライド窓ベース の辞書式圧縮アルゴリズムを採用 【例】 ここに着目 おまえのものはおれのもの、おれのものもおれのもの いま着目している文字列(右側)が、 過去(左側)のどの場所にどの長さで 出現したのか? を求める 29
30.
Dictionary compression •gzip (zlib)
などど同じスライド窓ベース の辞書式圧縮アルゴリズムを採用 【例】 おまえのものはおれのもの、おれのものもおれのもの 一致情報(場所、長さ)を符号化する 30
31.
Dictionary compression •gzip (zlib)
などど同じスライド窓ベース の辞書式圧縮アルゴリズムを採用 【例】 おまえのものはおれのもの、おれのものもおれのもの おまえのものはおれ(6,3)、(6,5)も(6,5) 31
32.
Dictionary compression •gzip (zlib)
などど同じスライド窓ベース の辞書式圧縮アルゴリズムを採用 【例】 おまえのものはおれのもの、おれのものもおれのもの おまえのものはおれ(6,3)、(6,5)も(6,5) 6つ前の3文字と 一致しているよ! 32
33.
Pattern matching problem •辞書式圧縮アルゴリズムは
「文字列照合問題」 「文字列探索問題」 と捉えることができる 33
34.
Why fast ?
34
35.
Why fast ? •機能をちょっと制限する •泥臭い努力をする •探索を端折る •一致長をすばやく算出する •細かいことはしない
35
36.
機能をちょっと 制限する
36
37.
API 構成
37
38.
API 構成 •ブロック単位での圧縮・伸長のみをサポート
38
39.
API 構成 •ブロック単位での圧縮・伸長のみをサポート
データ 39
40.
API 構成 •ブロック単位での圧縮・伸長のみをサポート
データ ブロック ブロック ブロック ブロック ライブラリ利用者がブロックに分割する 40
41.
API 構成 •ブロック単位での圧縮・伸長のみをサポート
データ ブロック ブロック ブロック ブロック LZ4_compress() LZ4_compress() LZ4_compress() LZ4_compress() それぞれのブロックごとに API を呼び出す 41
42.
API 構成 •ブロック単位での圧縮・伸長のみをサポート
データ ブロック ブロック ブロック ブロック LZ4_compress() LZ4_compress() LZ4_compress() LZ4_compress() 圧縮済み 圧縮済み 圧縮済み 圧縮済み 42
43.
API 構成 •ブロック単位での圧縮・伸長のみをサポート •
ブロックごとに API を呼び出す • ブロックの大きさは任意(<1.9GB)に指定できる •デメリット • zlib のようなストリーム処理ができない •メリット • API 側の実装がシンプルになる(co-routine 的な 実装をしなくていい) • API 呼び出しをマルチスレッド化できる 43
44.
泥臭い努力をする
44
45.
2/4/8 バイト単位でまとめてアクセス
45
46.
2/4/8 バイト単位でまとめてアクセス •バイト列をまとめて処理したいことが よくあります
•2つのバイト列の比較 •バイト列のコピー(memcpy()) •ハッシュ値の計算 • 連続する4バイトをハッシュ値計算に使う •バイト列のまま、1バイトずつ処理し ていては効率がよくない… 46
47.
2/4/8 バイト単位でまとめてアクセス •byte のポインタを
word / dword / qword のポインタと してアクセスすれば、複数バイトを まとめて処理できるようになる! •アライメントの境界をまたいで アクセスすると怒られる CPU 向けに、 ちょっと工夫が必要 47
48.
2/4/8 バイト単位でまとめてアクセス アライメントの境界を超えてメモリアクセスすると
エラーとなってしまう環境のために、構造体経由で アクセスする 48
49.
利用例 •バイト列の比較 •バイト列のコピー •ハッシュ値の計算
49
50.
探索を端折る
50
51.
ハッシュ表による探索
51
52.
ハッシュ表による探索 •ハッシュ表で4バイトの一致がある場所を 検出する •
連続する4バイトをハッシュして key とする • value はその4バイトの出現位置 •デメリット • ハッシュ衝突により、一致を検出できない ことがある(衝突したら諦める) •メリット • 定数オーダーで一致があるかないかを判別 することができる 52
53.
ハッシュ表による探索 圧縮対象の文字列 GrapeAppleGrapefruit 今着目しているこの文字列に
ハッシュ表 一致する場所を探そう hashTable[ 0] : 7 “pleGrapefr...” ・・・ hashTable[12] : 2 “apeAppleGr...” hashTable[13] : 5 “AppleGrape...” ・・・ hashTable[27] : 1 “rapeAppleg...” ・・・ hashTable[33] : 0 “GrapeApple...” ・・・ hashTable[36] : 3 “peAppleGra...” 53 ・・・
54.
ハッシュ表による探索 圧縮対象の文字列 GrapeAppleGrapefruit “eGra” のハッシュ値は 27
ハッシュ表 hashTable[ 0] : 7 “pleGrapefr...” ・・・ hashTable[12] : 2 “apeAppleGr...” hashTable[13] : 5 “AppleGrape...” ・・・ hashTable[27] : 1 “rapeAppleg...” ・・・ hashTable[33] : 0 “GrapeApple...” ・・・ hashTable[36] : 3 “peAppleGra...” 54 ・・・
55.
ハッシュ表による探索 圧縮対象の文字列 GrapeAppleGrapefruit
ハッシュ表 hashTable[ 0] : 7 “pleGrapefr...” ・・・ hashTable[12] : 2 “apeAppleGr...” hashTable[27] のエントリ hashTable[13] : 5 “AppleGrape...” とは文字列が一致しないの ・・・ で、エントリを上書きして hashTable[27] : 9 “eGrapefrui...” 次に進む ・・・ hashTable[33] : 0 “GrapeApple...” ・・・ hashTable[36] : 3 “peAppleGra...” 55 ・・・
56.
ハッシュ表による探索 圧縮対象の文字列 GrapeAppleGrapefruit 次の “eGra” のハッシュ値
ハッシュ表 は 33 hashTable[ 0] : 7 “pleGrapefr...” ・・・ hashTable[12] : 2 “apeAppleGr...” hashTable[13] : 5 “AppleGrape...” ・・・ hashTable[27] : 9 “eGrapefrui...” ・・・ hashTable[33] : 0 “GrapeApple...” ・・・ hashTable[36] : 3 “peAppleGra...” 56 ・・・
57.
ハッシュ表による探索 圧縮対象の文字列 GrapeAppleGrapefruit 次の “eGra” のハッシュ値
ハッシュ表 は 33 hashTable[ 0] : 7 “pleGrapefr...” ・・・ hashTable[12] : 2 “apeAppleGr...” hashTable[13] : 5 “AppleGrape...” ・・・ hashTable[27] : 9 一致 “eGrapefrui...” ・・・ hashTable[33] : 0 “GrapeApple...” ・・・ hashTable[36] : 3 “peAppleGra...” 57 ・・・
58.
ハッシュ表による探索 圧縮対象の文字列 GrapeAppleGrapefruit
ハッシュ表 hashTable[ 0] : 7 “pleGrapefr...” ・・・ hashTable[12] : 2 “apeAppleGr...” hashTable[13] : 5 “AppleGrape...” hashTable[33] のエントリ ・・・ と文字列が5文字一致する hashTable[27] : 9 “eGrapefrui...” ので圧縮する(&エントリ ・・・ を上書きする) hashTable[33] : 10 “Grapefluit...” ・・・ hashTable[36] : 3 “peAppleGra...” 58 ・・・
59.
探索位置をスキップする
59
60.
探索位置をスキップする •圧縮しにくい(=一致するものがない) 文字列の並びを読み飛ばす仕組み •snappy
でも採用されている •スキップの幅を少しずつ広げる 60
61.
探索位置をスキップする •圧縮しにくい(=一致するものがない)
文字列の並びを読み飛ばす仕組み •snappy でも採用されている •スキップの幅を少しずつ広げる hogelNieafhInknQVS4Swk2QwOZmzSOthogehogehoge 61
62.
探索位置をスキップする •圧縮しにくい(=一致するものがない)
文字列の並びを読み飛ばす仕組み •snappy でも採用されている •スキップの幅を少しずつ広げる hogelNieafhInknQVS4Swk2QwOZmzSOthogehogehoge 最初は 1文字ずつ 62
63.
探索位置をスキップする •圧縮しにくい(=一致するものがない)
文字列の並びを読み飛ばす仕組み •snappy でも採用されている •スキップの幅を少しずつ広げる hogelNieafhInknQVS4Swk2QwOZmzSOthogehogehoge なかなか一致が 見つからないなら、 2文字おきに探す 63
64.
探索位置をスキップする •圧縮しにくい(=一致するものがない)
文字列の並びを読み飛ばす仕組み •snappy でも採用されている •スキップの幅を少しずつ広げる hogelNieafhInknQVS4Swk2QwOZmzSOthogehogehoge それでも見つからなければ 4文字おきにする 64
65.
探索位置をスキップする •圧縮しにくい(=一致するものがない)
文字列の並びを読み飛ばす仕組み •snappy でも採用されている •スキップの幅を少しずつ広げる 一致 hogelNieafhInknQVS4Swk2QwOZmzSOthogehogehoge 一致する文字列が見つかった ところでリセットする 65
66.
探索位置をスキップする •圧縮しにくい(=一致するものがない) 文字列の並びを読み飛ばす仕組み •snappy
でも採用されている •スキップの幅を少しずつ広げる •デメリット •圧縮できる文字列を取りこぼしてしまう •メリット •無駄な比較の回数を減らすことができる 66
67.
【参考】スキップされた一致の回収
67
68.
【参考】スキップされた一致の回収 •スキップにより取りこぼされてしまっ た文字列の一致をちょっとだけ回収す るしくみ
•後方方向だけでなく、前方にも向かって 一致を確認する 68
69.
【参考】スキップされた一致の回収 •スキップにより取りこぼされてしまっ た文字列の一致をちょっとだけ回収す るしくみ
•後方方向だけでなく、前方にも向かって 一致を確認する 一致 hogefugalNi … ZmzSOthogefugahoge 4文字の一致が見つかった 69
70.
【参考】スキップされた一致の回収 •スキップにより取りこぼされてしまっ た文字列の一致をちょっとだけ回収す るしくみ
•後方方向だけでなく、前方にも向かって 一致を確認する 後に続く ga が一致している hogefugalNi … ZmzSOthogefugahoge 70
71.
【参考】スキップされた一致の回収 •スキップにより取りこぼされてしまっ た文字列の一致をちょっとだけ回収す るしくみ
•後方方向だけでなく、前方にも向かって 一致を確認する さらには前に続く ho も一致 している(計8文字の一致) hogefugalNi … ZmzSOthogefugahoge 71
72.
【参考】スキップされた一致の回収 •スキップにより取りこぼされてしまっ た文字列の一致をちょっとだけ回収す るしくみ
•後方方向だけでなく、前方にも向かって 一致を確認する •メリット •時間性能に大きな影響を与えることなく 圧縮性能を改善できる 72
73.
一致長をすばやく 算出する
73
74.
一致長の算出 2つの文字列の一致長を高速に求めたい… きみがためはるののにいでてわかなつむ …
きみがためをしからざりしいのちさへ … 74
75.
一致長の算出 2つの文字列の一致長を高速に求めたい… きみがためはるののにいでてわかなつむ …
きみがためをしからざりしいのちさへ … 1文字ずつ比較すれば 確実! (けど遅い…) 75
76.
一致長の算出 •概要 • ハッシュ表により検出された4文字の一致に
続く、後続の一致文字数を算出する •戦略 1. 4 or 8 バイトの単位でざくざく一致を確認 • 32bit 環境は 4 バイト、64bit 環境は 8 バイト 単位 2. 上記単位での不一致が見つかったところで、 厳密な一致長を確定する 76
77.
ざっくりと一致を確認する
77
78.
ざっくりと一致を確認する •2つの文字列を4or8バイトずつずら しながら XOR
をとる •XOR の結果が 0 なら一致しているよね •XOR の結果が 0 でなければ一致してない よね • 後述する処理により、何バイトの一致があっ たのかを厳密に算出する 78
79.
ざっくりと一致を確認する
一致 FooBarBarBarFooBarBarBaz 最初の4バイトの一致が見つかった状態 79
80.
ざっくりと一致を確認する FooBarBarBarFooBarBarBaz
‘arBa’ ⊕ ‘arBa’=0 続く4バイトの XOR の結果が 0 なら次の4バイトへ 80
81.
ざっくりと一致を確認する FooBarBarBarFooBarBarBaz
‘rBar’ ⊕ ‘rBaz’!=0 XOR の結果が 0 でないところで ざっくり一致長の算出を終える 81
82.
一致長を厳密に確認する
82
83.
一致長を厳密に確認する •早い話が、LSB を求める問題になる •4or8バイトの XOR
の結果(!=0)から以下 の方法で算出 • x86 の bsr 命令を利用する • [VC] _BitScanReverse/_BitScanReverse64() • [gcc] __builtin_clzll() • 頑張って計算する • 二分探索 • De Bruijn 数列を利用 83
84.
一致長を厳密に確認する •De Bruijn 数列を使った
LSB ぽい計算 •条件分岐を一切排除することができる • 補数 • ビット積 • 乗算 • ビットシフト • ルックアップテーブル参照 詳細は右記URLを参照:http://fastcompression.blogspot.jp/2011/12/fast-sequence-comparison.html 84
85.
細かいことは しない
85
86.
辞書式圧縮アルゴリズムの出力 •出力されるもの •リテラル文字列(圧縮できない文字列) •リテラルの長さ
•一致した場所の情報 •一致した長さ •圧縮率を高めるにはビット単位で出力 したいところ •Huffman 符号/算術符号などを利用 86
87.
ビット演算・出力を極力しない •LZ4 ではバイト単位で出力する •ビットマスクの演算も非常に少ない 図:http://fastcompression.blogspot.jp/2011/05/lz4-explained.html
87
88.
ビット演算・出力を極力しない •LZ4 ではバイト単位で出力する •ビットマスクの演算も非常に少ない ビット演算が必要 なのはここだけ 図:http://fastcompression.blogspot.jp/2011/05/lz4-explained.html
88
89.
Conclusion
89
90.
Conclusion •機能をちょっと制限する •泥臭い努力をする •探索を端折る •一致長をすばやく算出する •細かいことはしない
90
91.
ご清聴 ありがとうござい ました!!!
91
92.
We’re hiring !!!
分析力をコアとする情報最適化企業 では、一緒に楽しくお仕事できる エンジニアを募集しています! 92
93.
こちらも募集中! データマイニング+WEB勉強会@ 東京(#TokyoWebmining)では
スピーカーを大絶賛募集中です! https://groups.google.com/forum/?fromgroups=#!forum/webmining-tokyo 93