学習データの数がだんだんでかくなってきており、2000万サンプルくらいになってきている。こうなってくると「素性をファイルに書き出し、学習木に読み込ませる(学習はさせてない)」というプロセスすら結構時間がかかってくる。自然言語処理だとこのくらいのサンプル数は普通にあるので、どうにかできるようになっておきたい。ということで、バイナリで吐いてバイナリで読み込むことにしてみた(代替手段を知らない)*1。
結論としては結構早くなったので割と満足なんだが、バイナリで吐き出すとかインターンのときの圧縮の講義以来&C++では初めてだったので、かなーりつまづいた。固定長のデータは簡単だからいいんだが、可変長のデータにつまづいた。vectorなどの可変長のものを書き込むときには「以降いくつデータが入っているか」という数も書き込んでおかないとどこまで読めば区切りかが分からなくなるので、そういう情報が必要。例えば、こんな感じ。
int size = tmp.size(); out.write((char *) &size, sizeof(int)); BOOST_FOREACH(p, tmp) { out.write((char *) &(p), sizeof(std::pair<int, float>)); }
そうすると読み込むときにいくつデータがあるかを指定すればよいので、vectorとかでも読める。id:yuyarinにboost::archive::binary_oarchiveというのがあるよと教えてもらって、こっちのほうが簡単にできそうだったんだけど、自分のやつでやってみるとsegmentation falutになりまくりで、それを解決しようとするとえらい大変なことになったので、今回は使ってない。
*1:学習データとかがバイナリなのはどうよ?っていうのはとりあえずおいとく