Enviar búsqueda
Cargar
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
•
57 recomendaciones
•
77,812 vistas
Atsushi KOMIYA
Seguir
2012.9.30 の DSIRNLP #3 で発表した資料です。
Leer menos
Leer más
Tecnología
Denunciar
Compartir
Denunciar
Compartir
1 de 93
Recomendados
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
Yahoo!デベロッパーネットワーク
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
Yoshitaka Kawashima
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
Redisの特徴と活用方法について
Redisの特徴と活用方法について
Yuji Otani
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
Fixstars Corporation
分散システムについて語らせてくれ
分散システムについて語らせてくれ
Kumazaki Hiroki
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
Atsushi Nakamura
Recomendados
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
Yahoo!デベロッパーネットワーク
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
Yoshitaka Kawashima
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
Redisの特徴と活用方法について
Redisの特徴と活用方法について
Yuji Otani
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
Fixstars Corporation
分散システムについて語らせてくれ
分散システムについて語らせてくれ
Kumazaki Hiroki
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
Atsushi Nakamura
機械学習 / Deep Learning 大全 (4) GPU編
機械学習 / Deep Learning 大全 (4) GPU編
Daiyu Hatakeyama
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
Masahito Zembutsu
Dapr × Kubernetes ではじめるポータブルなマイクロサービス(CloudNative Days Tokyo 2020講演資料)
Dapr × Kubernetes ではじめるポータブルなマイクロサービス(CloudNative Days Tokyo 2020講演資料)
NTT DATA Technology & Innovation
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
Kumazaki Hiroki
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
Preferred Networks
マイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦い
ota42y
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
Mikiya Okuno
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
NTT DATA Technology & Innovation
Twitterのsnowflakeについて
Twitterのsnowflakeについて
moai kids
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
masayoshi takahashi
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
Python 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそう
Ryuji Tsutsui
世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計
増田 亨
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
WiredTigerを詳しく説明
WiredTigerを詳しく説明
Tetsutaro Watanabe
Pythonによる黒魔術入門
Pythonによる黒魔術入門
大樹 小倉
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
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
Más contenido relacionado
La actualidad más candente
機械学習 / Deep Learning 大全 (4) GPU編
機械学習 / Deep Learning 大全 (4) GPU編
Daiyu Hatakeyama
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
Masahito Zembutsu
Dapr × Kubernetes ではじめるポータブルなマイクロサービス(CloudNative Days Tokyo 2020講演資料)
Dapr × Kubernetes ではじめるポータブルなマイクロサービス(CloudNative Days Tokyo 2020講演資料)
NTT DATA Technology & Innovation
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
Kumazaki Hiroki
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
Preferred Networks
マイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦い
ota42y
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
Mikiya Okuno
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
NTT DATA Technology & Innovation
Twitterのsnowflakeについて
Twitterのsnowflakeについて
moai kids
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
masayoshi takahashi
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
Python 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそう
Ryuji Tsutsui
世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計
増田 亨
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
WiredTigerを詳しく説明
WiredTigerを詳しく説明
Tetsutaro Watanabe
Pythonによる黒魔術入門
Pythonによる黒魔術入門
大樹 小倉
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
La actualidad más candente
(20)
機械学習 / Deep Learning 大全 (4) GPU編
機械学習 / Deep Learning 大全 (4) GPU編
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
Dapr × Kubernetes ではじめるポータブルなマイクロサービス(CloudNative Days Tokyo 2020講演資料)
Dapr × Kubernetes ではじめるポータブルなマイクロサービス(CloudNative Days Tokyo 2020講演資料)
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
マイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦い
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Twitterのsnowflakeについて
Twitterのsnowflakeについて
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Python 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそう
世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
WiredTigerを詳しく説明
WiredTigerを詳しく説明
Pythonによる黒魔術入門
Pythonによる黒魔術入門
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
プログラムを高速化する話
プログラムを高速化する話
Similar a 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 a 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
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