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 # ...
CSVパーサー   require mmapscanner   class MmapCSV     include Enumerable     def initialize(filename)       File.open(filename...
速度     ken_all.csv(123000行, 12MB)
課題 1.9 only ASCII-8BIT only 明に munmap できない
FAQどうせ拡張ライブラリ作るんだったらCSVパーサーをCで書けば良かったんじゃね?
目的と手段の正しい理解目的: RubyでCSVパーサーを書く手段: 拡張ライブラリ
以上
Upcoming SlideShare
Loading in …5
×

MmapScanner

3,512 views

Published on

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,512
On SlideShare
0
From Embeds
0
Number of Embeds
813
Actions
Shares
0
Downloads
6
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

MmapScanner

  1. 1. MmapScanner とみたまさひろ 2011-07-18
  2. 2. 自己紹介 id:tmtms @tmtms 日本MySQLユーザ会 長野ソフトウェア技術者グループ (NSEG)
  3. 3. 重要「MySQL徹底入門第三版」近日発売 画像は第二版
  4. 4. Ruby たぶん13年くらい バージョン 1.1 から 「Rubyをイヤイヤ使わされてる人」を 作る仕事 SIerのRubyistの悲しき紋章
  5. 5. 趣味 誰も使わないライブラリを作る 自分でも使わない
  6. 6. MySQL/Ruby MySQL C library wrapper 割と使われてる オワコン
  7. 7. Ruby/MySQL pure Ruby あまり使われてない 名前が悪い
  8. 8. OptConfig OptionParser みたいなもの 設定ファイルから読む 自動補完する/しない --help に出すかどうか 複数指定した時のふるまい 最後を採用/配列で全部/エラー
  9. 9. LightCsv CSVパーサー 「うわっRubyのCSV遅すぎ」 ついカッとなって作った
  10. 10. 速度 ken_all.csv(123000行, 12MB)
  11. 11. 速度 ken_all.csv(123000行, 12MB)
  12. 12. LightCsv 103行 (コメント/空行除く) CSV のパースをするだけなのに
  13. 13. CSVパース 物理行単位で処理できない ほげ,"改行をrn含むカラム",ふが 固定サイズで読むと CR と LF がわ かれたり
  14. 14. 全部読んじゃえ メモリ食う
  15. 15. mmap(2) ファイルをメモリにマッピング
  16. 16. read通常は open して少しずつ read
  17. 17. mmapファイル全体(または一部)をメモリにマップ
  18. 18. mmap 速い メモリを食わない 大きなファイルで有用
  19. 19. Rubyからは使いにくい メモリを直接さわれない Stringとして扱う時はコピーが必要
  20. 20. MmapScanner Ruby の拡張ライブラリ StringScanner の mmap 版 mmap 領域を正規表現で走査 取り出したものも MmapScanner
  21. 21. MmapScanner部分的に取り出しても同じメモリを共有
  22. 22. 使い方 f = File.open("filename") m = MmapScanner.new(f) word = m.scan(/[a-z0-9_]+/i) word # => MmapScanner word.to_s # => String
  23. 23. 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
  24. 24. 速度 ken_all.csv(123000行, 12MB)
  25. 25. 課題 1.9 only ASCII-8BIT only 明に munmap できない
  26. 26. FAQどうせ拡張ライブラリ作るんだったらCSVパーサーをCで書けば良かったんじゃね?
  27. 27. 目的と手段の正しい理解目的: RubyでCSVパーサーを書く手段: 拡張ライブラリ
  28. 28. 以上

×