MmapScanner

Masahiro Tomita
Masahiro TomitaProgrammer at private
MmapScanner
  とみたまさひろ
   2011-07-18
自己紹介
 id:tmtms
 @tmtms
 日本MySQLユーザ会
 長野ソフトウェア技術者グループ
 (NSEG)
重要
「MySQL徹底入門第三版」近日発売
       画像は第二版
Ruby
 たぶん13年くらい
 バージョン 1.1 から
 「Rubyをイヤイヤ使わされてる人」を
 作る仕事
       SIerのRubyistの悲しき紋章
趣味
 誰も使わないライブラリを作る
 自分でも使わない
MySQL/Ruby
 MySQL C library wrapper
 割と使われてる
 オワコン
Ruby/MySQL
 pure Ruby
 あまり使われてない
 名前が悪い
OptConfig
  OptionParser みたいなもの
  設定ファイルから読む
  自動補完する/しない
  --help に出すかどうか
  複数指定した時のふるまい
   最後を採用/配列で全部/エラー
LightCsv
  CSVパーサー
  「うわっRubyのCSV遅すぎ」
  ついカッとなって作った
速度




     ken_all.csv(123000行, 12MB)
速度




     ken_all.csv(123000行, 12MB)
LightCsv
  103行 (コメント/空行除く)
  CSV のパースをするだけなのに
CSVパース
 物理行単位で処理できない
  ほげ,"改行をrn含むカラム",ふが

 固定サイズで読むと CR と LF がわ
 かれたり
全部読んじゃえ
 メモリ食う
mmap(2)
 ファイルをメモリにマッピング
read
通常は open して少しずつ read
mmap
ファイル全体(または一部)をメモリにマップ
mmap
 速い
 メモリを食わない
 大きなファイルで有用
Rubyからは使いにくい
 メモリを直接さわれない
 Stringとして扱う時はコピーが必要
MmapScanner
 Ruby の拡張ライブラリ
 StringScanner の mmap 版
 mmap 領域を正規表現で走査
 取り出したものも MmapScanner
MmapScanner
部分的に取り出しても同じメモリを共有
使い方
 f = File.open("filename")
 m = MmapScanner.new(f)
 word = m.scan(/[a-z0-9_]+/i)
 word       # => MmapScanner
 word.to_s # => String
CSVパーサー
   require 'mmapscanner'
   class MmapCSV
     include Enumerable
     def initialize(filename)
       File.open(filename) do |f|
         @ms = MmapScanner.new(f)
       end
     end
     def each
       rec = []
       until @ms.eos?
         if @ms.skip(/"((?:""|[^"])*)"(,|rn|n|z)/n)
           rec.push @ms.matched_str(1).gsub(/""/,'"')
         elsif @ms.skip(/([^,"rn]*)(,|rn|n|z)/n)
           rec.push @ms.matched_str(1)
         else
           raise "invalid format: #{@ms.rest.slice(0,20).to_s}"
         end
         unless @ms.matched_str(2) == ','
           yield rec
           rec.clear
         end
       end
     end
   end
速度




     ken_all.csv(123000行, 12MB)
課題
 1.9 only
 ASCII-8BIT only
 明に munmap できない
FAQ
どうせ拡張ライブラリ作るんだったら
CSVパーサーをCで書けば良かったん
じゃね?
目的と手段の正しい理解
目的: RubyでCSVパーサーを書く
手段: 拡張ライブラリ
以上
1 of 28

Recommended

Web時代の大富豪的プログラミングのススメ by
Web時代の大富豪的プログラミングのススメWeb時代の大富豪的プログラミングのススメ
Web時代の大富豪的プログラミングのススメHideyuki Takeuchi
7.3K views14 slides
どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会) by
どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会)どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会)
どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会)parrotstudio
1.2K views62 slides
ちゃんとWeb会議スライド『Coffee script』 by
ちゃんとWeb会議スライド『Coffee script』ちゃんとWeb会議スライド『Coffee script』
ちゃんとWeb会議スライド『Coffee script』H2O Space. Co., Ltd.
1.9K views30 slides
mrubyのfiberを試してみた by
mrubyのfiberを試してみたmrubyのfiberを試してみた
mrubyのfiberを試してみたKindai University
982 views15 slides
第87回PHP勉強会 LT 知って得するかもしれないテキスト処理コマンドのお話 by
第87回PHP勉強会 LT 知って得するかもしれないテキスト処理コマンドのお話第87回PHP勉強会 LT 知って得するかもしれないテキスト処理コマンドのお話
第87回PHP勉強会 LT 知って得するかもしれないテキスト処理コマンドのお話Ryo Shibayama
3K views23 slides
Psql & proctitle by
Psql & proctitlePsql & proctitle
Psql & proctitleYuichiro Naito
743 views10 slides

More Related Content

What's hot

エコなWebサーバー by
エコなWebサーバーエコなWebサーバー
エコなWebサーバーemasaka
691 views30 slides
Windows でも時刻合わせがしたい! by
Windows でも時刻合わせがしたい!Windows でも時刻合わせがしたい!
Windows でも時刻合わせがしたい!tsudaa
1.4K views28 slides
20130608 git-2 by
20130608 git-220130608 git-2
20130608 git-2Kasu Unko
850 views22 slides
第四回 #渋谷java オープニング by
第四回 #渋谷java オープニング第四回 #渋谷java オープニング
第四回 #渋谷java オープニングKazuhiro Serizawa
560 views3 slides
20110205.linux 0.01 by
20110205.linux 0.0120110205.linux 0.01
20110205.linux 0.01YAMANE Toshiaki
741 views17 slides
第二回 クラウドサーバー管理者若葉の会 by
第二回 クラウドサーバー管理者若葉の会第二回 クラウドサーバー管理者若葉の会
第二回 クラウドサーバー管理者若葉の会masayoshi shiraishi
612 views29 slides

What's hot(20)

エコなWebサーバー by emasaka
エコなWebサーバーエコなWebサーバー
エコなWebサーバー
emasaka691 views
Windows でも時刻合わせがしたい! by tsudaa
Windows でも時刻合わせがしたい!Windows でも時刻合わせがしたい!
Windows でも時刻合わせがしたい!
tsudaa1.4K views
20130608 git-2 by Kasu Unko
20130608 git-220130608 git-2
20130608 git-2
Kasu Unko850 views
第四回 #渋谷java オープニング by Kazuhiro Serizawa
第四回 #渋谷java オープニング第四回 #渋谷java オープニング
第四回 #渋谷java オープニング
Kazuhiro Serizawa560 views
第二回 クラウドサーバー管理者若葉の会 by masayoshi shiraishi
第二回 クラウドサーバー管理者若葉の会第二回 クラウドサーバー管理者若葉の会
第二回 クラウドサーバー管理者若葉の会
Javascriptで無限ループを実現する5つの方法 by yhara
Javascriptで無限ループを実現する5つの方法Javascriptで無限ループを実現する5つの方法
Javascriptで無限ループを実現する5つの方法
yhara10.2K views
kpfx07 LT ruby-processingでイケメンになりたい by koki_h
kpfx07 LT ruby-processingでイケメンになりたいkpfx07 LT ruby-processingでイケメンになりたい
kpfx07 LT ruby-processingでイケメンになりたい
koki_h1.2K views
Zshって最強らしい by ngi group.
Zshって最強らしいZshって最強らしい
Zshって最強らしい
ngi group.1.9K views
フレームワークを求めるな。ECMAScriptを使へ。 by Sachirou Inoue
フレームワークを求めるな。ECMAScriptを使へ。フレームワークを求めるな。ECMAScriptを使へ。
フレームワークを求めるな。ECMAScriptを使へ。
Sachirou Inoue1.3K views
かんたん!UMLのバージョン管理,どこでもモデリング by Kento Tsuji
かんたん!UMLのバージョン管理,どこでもモデリングかんたん!UMLのバージョン管理,どこでもモデリング
かんたん!UMLのバージョン管理,どこでもモデリング
Kento Tsuji2K views
Rubyでやろう。データ解析導入編( CSV, XML, JSON) by NAKAOKU Takahiro
Rubyでやろう。データ解析導入編( CSV, XML, JSON)Rubyでやろう。データ解析導入編( CSV, XML, JSON)
Rubyでやろう。データ解析導入編( CSV, XML, JSON)
NAKAOKU Takahiro4.5K views
XML Http Request Level2 の噂を聞いたので調べてみた by Shoot Morii
XML Http Request Level2 の噂を聞いたので調べてみたXML Http Request Level2 の噂を聞いたので調べてみた
XML Http Request Level2 の噂を聞いたので調べてみた
Shoot Morii2.2K views
Blenderを用いたリグ転送実験 by Kazuma Hatta
Blenderを用いたリグ転送実験Blenderを用いたリグ転送実験
Blenderを用いたリグ転送実験
Kazuma Hatta696 views
Erlangやってみた by ina job
ErlangやってみたErlangやってみた
Erlangやってみた
ina job663 views
Rubyでつくるスレッド by Shugo Maeda
RubyでつくるスレッドRubyでつくるスレッド
Rubyでつくるスレッド
Shugo Maeda578 views
Webサーバの性能測定 by Ryo Maruyama
Webサーバの性能測定Webサーバの性能測定
Webサーバの性能測定
Ryo Maruyama4.5K views

Similar to MmapScanner

ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発 by
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発emasaka
1.3K views28 slides
Lispとは何なのか - 同図像性がもたらす力とその利用法 by
Lispとは何なのか - 同図像性がもたらす力とその利用法Lispとは何なのか - 同図像性がもたらす力とその利用法
Lispとは何なのか - 同図像性がもたらす力とその利用法Naoya Yamashita
246 views27 slides
並列対決 Elixir × Go × C# x Scala , Node.js by
並列対決 Elixir × Go × C# x Scala , Node.js並列対決 Elixir × Go × C# x Scala , Node.js
並列対決 Elixir × Go × C# x Scala , Node.jsYoshiiro Ueno
3.9K views51 slides
lispmeetup#63 Common Lispでゼロから作るDeep Learning by
lispmeetup#63 Common Lispでゼロから作るDeep Learninglispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep LearningSatoshi imai
2.5K views52 slides
Scalaで萌える関数型プログラミング[1.1.RC1] by
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Ra Zon
2.1K views53 slides
Lisp Tutorial for Pythonista : Day 3 by
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Ransui Iso
3.3K views33 slides

Similar to MmapScanner(20)

ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発 by emasaka
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
emasaka1.3K views
Lispとは何なのか - 同図像性がもたらす力とその利用法 by Naoya Yamashita
Lispとは何なのか - 同図像性がもたらす力とその利用法Lispとは何なのか - 同図像性がもたらす力とその利用法
Lispとは何なのか - 同図像性がもたらす力とその利用法
Naoya Yamashita246 views
並列対決 Elixir × Go × C# x Scala , Node.js by Yoshiiro Ueno
並列対決 Elixir × Go × C# x Scala , Node.js並列対決 Elixir × Go × C# x Scala , Node.js
並列対決 Elixir × Go × C# x Scala , Node.js
Yoshiiro Ueno3.9K views
lispmeetup#63 Common Lispでゼロから作るDeep Learning by Satoshi imai
lispmeetup#63 Common Lispでゼロから作るDeep Learninglispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learning
Satoshi imai2.5K views
Scalaで萌える関数型プログラミング[1.1.RC1] by Ra Zon
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
Ra Zon2.1K views
Lisp Tutorial for Pythonista : Day 3 by Ransui Iso
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
Ransui Iso3.3K views
RとSQLiteで気軽にデータベース作成 by 弘毅 露崎
RとSQLiteで気軽にデータベース作成RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成
弘毅 露崎10.1K views
Raspberry pi 用 toppers ssp シュリンク版(海賊版)の紹介 by Kazuhiro Takahashi
Raspberry pi 用 toppers ssp シュリンク版(海賊版)の紹介Raspberry pi 用 toppers ssp シュリンク版(海賊版)の紹介
Raspberry pi 用 toppers ssp シュリンク版(海賊版)の紹介
MySQLを割と一人で300台管理する技術 by yoku0825
MySQLを割と一人で300台管理する技術MySQLを割と一人で300台管理する技術
MySQLを割と一人で300台管理する技術
yoku082550.4K views
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen by MITSUNARI Shigeo
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgenIntel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
MITSUNARI Shigeo2.4K views
メタメタプログラミングRuby by emasaka
メタメタプログラミングRubyメタメタプログラミングRuby
メタメタプログラミングRuby
emasaka992 views
XMonad-oid on Emacs & More functional Emacs Lisp | 関数型LT大会 by Takeshi Okada
XMonad-oid on Emacs & More functional Emacs Lisp | 関数型LT大会XMonad-oid on Emacs & More functional Emacs Lisp | 関数型LT大会
XMonad-oid on Emacs & More functional Emacs Lisp | 関数型LT大会
Takeshi Okada1.7K views
ADVENTURE_Mates Ver.0.5b データ生成 by ADVENTURE Project
ADVENTURE_Mates Ver.0.5b データ生成ADVENTURE_Mates Ver.0.5b データ生成
ADVENTURE_Mates Ver.0.5b データ生成
ADVENTURE Project546 views
第2回品川Redmine勉強会(日本語全文検索) by Masanori Machii
第2回品川Redmine勉強会(日本語全文検索)第2回品川Redmine勉強会(日本語全文検索)
第2回品川Redmine勉強会(日本語全文検索)
Masanori Machii7.9K views
Scalaで萌える関数型プログラミング[完全版] by Ra Zon
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
Ra Zon6.9K views
PHPで大規模ブラウザゲームを開発してわかったこと by Kentaro Matsui
PHPで大規模ブラウザゲームを開発してわかったことPHPで大規模ブラウザゲームを開発してわかったこと
PHPで大規模ブラウザゲームを開発してわかったこと
Kentaro Matsui138.4K views

More from Masahiro Tomita

お前の罪を数えろ by
お前の罪を数えろお前の罪を数えろ
お前の罪を数えろMasahiro Tomita
2.4K views73 slides
Ruby 2.5 by
Ruby 2.5Ruby 2.5
Ruby 2.5Masahiro Tomita
2.7K views53 slides
本当はこわいMySQLプロトコル by
本当はこわいMySQLプロトコル本当はこわいMySQLプロトコル
本当はこわいMySQLプロトコルMasahiro Tomita
4.4K views21 slides
ネットワークこわい by
ネットワークこわいネットワークこわい
ネットワークこわいMasahiro Tomita
1.7K views14 slides
CSV by
CSVCSV
CSVMasahiro Tomita
3K views15 slides
MySQLの文字コード事情 2017春版 by
MySQLの文字コード事情 2017春版MySQLの文字コード事情 2017春版
MySQLの文字コード事情 2017春版Masahiro Tomita
10.2K views62 slides

More from Masahiro Tomita(20)

本当はこわいMySQLプロトコル by Masahiro Tomita
本当はこわいMySQLプロトコル本当はこわいMySQLプロトコル
本当はこわいMySQLプロトコル
Masahiro Tomita4.4K views
MySQLの文字コード事情 2017春版 by Masahiro Tomita
MySQLの文字コード事情 2017春版MySQLの文字コード事情 2017春版
MySQLの文字コード事情 2017春版
Masahiro Tomita10.2K views
MySQLの文字コード事情 2017版 by Masahiro Tomita
MySQLの文字コード事情 2017版MySQLの文字コード事情 2017版
MySQLの文字コード事情 2017版
Masahiro Tomita35.2K views
MySQLの文字コード事情 by Masahiro Tomita
MySQLの文字コード事情MySQLの文字コード事情
MySQLの文字コード事情
Masahiro Tomita21.5K views
「理論から学ぶデータベース実践入門」読書会スペシャル by Masahiro Tomita
「理論から学ぶデータベース実践入門」読書会スペシャル「理論から学ぶデータベース実践入門」読書会スペシャル
「理論から学ぶデータベース実践入門」読書会スペシャル
Masahiro Tomita4.9K views
アジャイルジャパン長野サテライト by Masahiro Tomita
アジャイルジャパン長野サテライトアジャイルジャパン長野サテライト
アジャイルジャパン長野サテライト
Masahiro Tomita1.7K views

Recently uploaded

The Things Stack説明資料 by The Things Industries by
The Things Stack説明資料 by The Things IndustriesThe Things Stack説明資料 by The Things Industries
The Things Stack説明資料 by The Things IndustriesCRI Japan, Inc.
58 views29 slides
定例会スライド_キャチs 公開用.pdf by
定例会スライド_キャチs 公開用.pdf定例会スライド_キャチs 公開用.pdf
定例会スライド_キャチs 公開用.pdfKeio Robotics Association
111 views64 slides
さくらのひやおろし2023 by
さくらのひやおろし2023さくらのひやおろし2023
さくらのひやおろし2023法林浩之
96 views58 slides
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料) by
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)NTT DATA Technology & Innovation
18 views38 slides
SSH応用編_20231129.pdf by
SSH応用編_20231129.pdfSSH応用編_20231129.pdf
SSH応用編_20231129.pdficebreaker4
335 views13 slides
JJUG CCC.pptx by
JJUG CCC.pptxJJUG CCC.pptx
JJUG CCC.pptxKanta Sasaki
6 views14 slides

Recently uploaded(11)

The Things Stack説明資料 by The Things Industries by CRI Japan, Inc.
The Things Stack説明資料 by The Things IndustriesThe Things Stack説明資料 by The Things Industries
The Things Stack説明資料 by The Things Industries
CRI Japan, Inc.58 views
さくらのひやおろし2023 by 法林浩之
さくらのひやおろし2023さくらのひやおろし2023
さくらのひやおろし2023
法林浩之96 views
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料) by NTT DATA Technology & Innovation
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
SSH応用編_20231129.pdf by icebreaker4
SSH応用編_20231129.pdfSSH応用編_20231129.pdf
SSH応用編_20231129.pdf
icebreaker4335 views
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20... by NTT DATA Technology & Innovation
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
SNMPセキュリティ超入門 by mkoda
SNMPセキュリティ超入門SNMPセキュリティ超入門
SNMPセキュリティ超入門
mkoda355 views
Windows 11 information that can be used at the development site by Atomu Hidaka
Windows 11 information that can be used at the development siteWindows 11 information that can be used at the development site
Windows 11 information that can be used at the development site
Atomu Hidaka88 views

MmapScanner