SlideShare a Scribd company logo
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パーサーを書く
手段: 拡張ライブラリ
以上

More Related Content

PDF
Web時代の大富豪的プログラミングのススメ
PDF
どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会)
PDF
ちゃんとWeb会議スライド『Coffee script』
PDF
mrubyのfiberを試してみた
PDF
第87回PHP勉強会 LT 知って得するかもしれないテキスト処理コマンドのお話
ODP
Psql & proctitle
PDF
LT#7 Hello coffeeしてきた
PDF
Rustのタスクモデルについて
Web時代の大富豪的プログラミングのススメ
どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会)
ちゃんとWeb会議スライド『Coffee script』
mrubyのfiberを試してみた
第87回PHP勉強会 LT 知って得するかもしれないテキスト処理コマンドのお話
Psql & proctitle
LT#7 Hello coffeeしてきた
Rustのタスクモデルについて

What's hot (20)

PDF
エコなWebサーバー
PDF
Windows でも時刻合わせがしたい!
ODP
20130608 git-2
PDF
第四回 #渋谷java オープニング
PDF
20110205.linux 0.01
PDF
第二回 クラウドサーバー管理者若葉の会
PPT
Javascriptで無限ループを実現する5つの方法
ODP
kpfx07 LT ruby-processingでイケメンになりたい
PPTX
Zshって最強らしい
PPTX
フレームワークを求めるな。ECMAScriptを使へ。
PPTX
かんたん!UMLのバージョン管理,どこでもモデリング
PDF
membase
PDF
Rubyでやろう。データ解析導入編( CSV, XML, JSON)
PDF
XML Http Request Level2 の噂を聞いたので調べてみた
PDF
Webページで学ぶJavaScript2013 第1回
PDF
Blenderを用いたリグ転送実験
PDF
Erlangやってみた
PDF
詳解! Decimal
PDF
Rubyでつくるスレッド
PDF
Webサーバの性能測定
エコなWebサーバー
Windows でも時刻合わせがしたい!
20130608 git-2
第四回 #渋谷java オープニング
20110205.linux 0.01
第二回 クラウドサーバー管理者若葉の会
Javascriptで無限ループを実現する5つの方法
kpfx07 LT ruby-processingでイケメンになりたい
Zshって最強らしい
フレームワークを求めるな。ECMAScriptを使へ。
かんたん!UMLのバージョン管理,どこでもモデリング
membase
Rubyでやろう。データ解析導入編( CSV, XML, JSON)
XML Http Request Level2 の噂を聞いたので調べてみた
Webページで学ぶJavaScript2013 第1回
Blenderを用いたリグ転送実験
Erlangやってみた
詳解! Decimal
Rubyでつくるスレッド
Webサーバの性能測定
Ad

Similar to MmapScanner (7)

PDF
Ruby 同好会宣言
ODP
Rubyのソースコードを読んでみよう(入門編)
PDF
Write good parser in perl
PDF
Ruby 2.5
PDF
Ruby の文字列について
PDF
RubyのDir、File、IO について
Ruby 同好会宣言
Rubyのソースコードを読んでみよう(入門編)
Write good parser in perl
Ruby 2.5
Ruby の文字列について
RubyのDir、File、IO について
Ad

More from Masahiro Tomita (20)

PDF
お前の罪を数えろ
PDF
本当はこわいMySQLプロトコル
PDF
ネットワークこわい
PDF
MySQLの文字コード事情 2017春版
PDF
MySQLの文字コード事情 2017版
PDF
PDF
MySQLの文字コード事情
PDF
進捗と品質
PDF
MySQLを拡張する
PDF
「理論から学ぶデータベース実践入門」読書会スペシャル
PDF
MyNAができるまで
PDF
文字化け
PDF
PDF
メールの暗号化
PDF
文字化け
PDF
進捗と品質
PDF
アジャイルジャパン長野サテライト
PDF
🍣=🍺
PDF
本当はこわいエンコーディングの話
PDF
Sequelのすすめ
お前の罪を数えろ
本当はこわいMySQLプロトコル
ネットワークこわい
MySQLの文字コード事情 2017春版
MySQLの文字コード事情 2017版
MySQLの文字コード事情
進捗と品質
MySQLを拡張する
「理論から学ぶデータベース実践入門」読書会スペシャル
MyNAができるまで
文字化け
メールの暗号化
文字化け
進捗と品質
アジャイルジャパン長野サテライト
🍣=🍺
本当はこわいエンコーディングの話
Sequelのすすめ

MmapScanner