mmapパッケージを使ってお手軽オブジェクト管理

17
mmapパッケージを使って お手軽オブジェクト管理 2011年11月26日 Japan.R LT @sfchaos

Upload: sfchaos

Post on 15-Jan-2015

1.316 views

Category:

Documents


4 download

DESCRIPTION

 

TRANSCRIPT

Page 1: mmapパッケージを使ってお手軽オブジェクト管理

mmapパッケージを使ってお手軽オブジェクト管理

2011年11月26日

Japan.R LT

@sfchaos

Page 2: mmapパッケージを使ってお手軽オブジェクト管理

2

自己紹介

�データ分析コンサルタント

�一昔前はRやC++で金融工学

�最近はヘルスケア関連の分析

Page 3: mmapパッケージを使ってお手軽オブジェクト管理

3

Rの問題点としてよく聞く話

「Rはオンメモリだから

大規模データは無理・・・」

Page 4: mmapパッケージを使ってお手軽オブジェクト管理

4

確かに1オブジェクトが

数10GB~TBクラスの

データをRで扱うのは難しい

※ Revolution Analytics, bigmemory, ffなどを

使う手はあるが,機能が限定的

Page 5: mmapパッケージを使ってお手軽オブジェクト管理

5

だが,手元で分析する場合は,

複数のオブジェクトが積み重なり

メモリを逼迫することも少なくない

(体験談)

Page 6: mmapパッケージを使ってお手軽オブジェクト管理

6

それなら,必要なときに

read.csv(or read.table/scan)

で読み込もう!

Page 7: mmapパッケージを使ってお手軽オブジェクト管理

7

遅っ・・・!(CPU: Intel Core i7)

> # Data Expo 2009のデータを読み込む(2008年度分)> system.time(x <- read.csv("../data/2008.csv"))   ユーザ システム  経過 70.790 6.730 78.874

Page 8: mmapパッケージを使ってお手軽オブジェクト管理

8

あるいはsave/load関数で

バイナリ形式で保存・読み込む

Page 9: mmapパッケージを使ってお手軽オブジェクト管理

9

この方法は

データ全体を読み込むので

オブジェクトが不要になったら

人力で削除しなければならない

Page 10: mmapパッケージを使ってお手軽オブジェクト管理

10

そんなとき役立つかもしれないのが

mmapパッケージ!

Page 11: mmapパッケージを使ってお手軽オブジェクト管理

11

> # Data Expo 2009のデータ(2008年度分,657MB)

> system.time(x <- read.csv("../data/2008.csv"))

  ユーザ システム  経過

70.790 6.730 78.874

> object.size(x)

813470376 bytes

> gc() used (Mb) gc trigger (Mb) max used (Mb)

Ncells 181957 9.8 407500 21.8 350000 18.7

Vcells 101932893 777.7 310681082 2370.4 310100488 2365.9

Page 12: mmapパッケージを使ってお手軽オブジェクト管理

12

確かに最初はmmap形式にデータを変換するのに時間はかかるが

一旦生成すればメモリへの負担は軽い

> system.time(y <- as.mmap(x, file="2008.mmap"))

ユーザ システム 経過

26.340 75.590 352.476

> object.size(y)

264 bytes

> rm(x)

Page 13: mmapパッケージを使ってお手軽オブジェクト管理

13

データフレームで読みこんだ後に

mmapに変換するのではなく,

フラットファイルから直接mmapに

変換したい

Page 14: mmapパッケージを使ってお手軽オブジェクト管理

14

mmap.csvという関数があるが,

うまくいかず・・・

Page 15: mmapパッケージを使ってお手軽オブジェクト管理

15

とは言うものの,

やはり巨大なデータも扱いたい!

Page 16: mmapパッケージを使ってお手軽オブジェクト管理

16

bigmemoryパッケージ周辺の機能を

拡張したい!

Page 17: mmapパッケージを使ってお手軽オブジェクト管理

17

class BigDataFrame : boost::noncopyable{ public: enum DataType {CHAR=1, SHORT=2, INT=3, DOUBLE=4, COMPLEX=5};

public: BigDataFrame(index_type nrow, index_type ncol) : nrow_(nrow), ncol_(ncol) { // initializing shared pointer p = std::shared_ptr<Monitor>(new Monitor[ncol], std::default_delete<Monitor[]>());

template <typename T>struct RecordValueVisitor : boost::static_visitor<>{ RecordValueVisitor(T const& v) : val_(v) { }

void operator ()(std::vector<T>& vec) const { vec.push_back(this->val_); }

private: T val_;};

まずはbigmemoryのデータフレーム版を目指して開発していきたい

期待せずに待っていてください・・・