読者です 読者をやめる 読者になる 読者になる

botchy hack note

TypeScript、Ruby、Golang とか Macとかの備忘録です.間違いがあるとご指摘くださると嬉しいです.

Rのファイル読み込み速度比較 csvとrds

Rを使っているときにファイルの読み込み速度はボトルネックになることが多い。 同じスクリプトを何度も繰り返し実行するとき、ファイルの読み込みに膨大な時間がかかると、とてもストレスフルです。

できればデータなんてさっさと読み込んでデータと戯れたい…

そんなあなたにおすすめできるのがrdsというファイル形式でデータを扱うことです。

rdsはRのオブジェクトを保存しておくためのファイル形式。 Rに最適化されているためか、読み込みが早いらしい。

今回はこのrdsとcsvの読み込み速度にどれだけ差があるのか実験します。

実験方法

csvファイルを一度Rで読み込みrdsとして保存したファイル*1 と生のcsvの読み込み速度を比較します。

rdsはreadRDS、csvはfread関数を使って読み込む。

それぞれのファイルサイズは以下のとおり。

ファイル形式 ファイルサイズ
csv 839MB
rds 155MB

なんかもうすでに結果が見えてる感じがしてますが、このまま続けます。

読み込みだけなのでスクリプトは非常に単純。

# csvファイル読み込み速度確認用
start  = proc.time()
system.time(r_data<-fread("csv_file.csv"))
end = proc.time()
print(end - start)
# rdsファイル読み込み速度確認用
start  = proc.time()
system.time(r_data<-readRDS("rds_file.rds"))
end = proc.time()
print(end - start)

実験結果

上記のスクリプトを実行した結果を次の表に示します。

ファイル形式 user system elapsed
csv 21.128 0.448 21.579
rds 5.060 0.369 5.431

表のuser,elapsedを見るとだいたい4倍速くなっていることが分かります。

今までなんとなくで使っていましたが、rds形式を使うのは有効みたいです。 みなさんもぜひお試しあれ。

*1:csvを一度読み込んでオブジェクトにし、saveRDS関数でオブジェクトをrds形式で書き出す。

VCSのtimescaleに関するエラーを消したいとき

Synopsys社のVCSで回路の動作検証をしようとしていたときに以下のエラーがでてきて困った.

Error-[ITSFM] Illegal `timescale for module
tb_dcstped_b01.v, 2
  Module "tb_b01" has `timescale but previous module(s) do not.
  Please refer LRM 1364-2001 section 19.8.

このエラー,どうやら回路記述の読み込みの順番が問題らしい.

エラーがでているときは,テストベンチ記述(tb_dcstped_b02.v)を後ろから二番目に読み込むようにしていた.

vcs -full64  -v ~/Scripts/Libraries/nangate.v tb_dcstped_b02.v dcstped_b02.v -R

これを以下のように一番最初に読み込むようにしてあげると,上手いことシミュレーションできた.

vcs -full64 tb_dcstped_b02.v -v ~/Scripts/Libraries/nangate.v dcstped_b02.v -R

追記1

.vファイルにtimescaleの指定がない場合にも同様のエラーが出た. その時は.vファイルに`timescale 1ns/1ns などとするとエラーが回避できた.

追記2

サブモジュールをインクルードしてる場合,timescaleを先に書かなければ同様のエラーが出る. 以下が間違った例.

`include "aaa.v"
`timescale 1ns/1ns

以下のようにするとエラー回避できる.

`timescale 1ns/1ns
`include "aaa.v"

findでPermission deniedを消したいとき

LinuxUnixで作業するときにfindコマンドを使うことがある.

findコマンドの出力結果でしばしば目にするのが Permission denied である.

目的の結果を見つけなければいけないこともあり,非常に迷惑この上ない.

そんな時は2> /dev/nullでエラー出力を捨ててしまえば良いらしい.

find / -name * 2> /dev/null

とすると Permission denied のときは/dev/nullという暗黒空間に出力を捨てさってくれます.

lsコマンドの出力に色を付ける

lsコマンドの出力結果に色を付ける方法について調べてみました. manコマンドでlsの説明を見ると,どうやらls -Gとすれば色が付くみたいです.

ls -G


と実行した結果がこちら.


f:id:bokken31:20130923163054p:plain


ただ,そのままだと見づらい.... 自分の好きな色にしたいときは環境変数LSCOLORSを変更すれば良いようです. デフォルトは以下のような設定になってます.

LSCOLORS=exfxcxdxbxegedabagacad


順番とアルファベットによってそれぞれの場所に色を設定します. 順番と場所の対応はそれぞれ以下のようになっていて,文字の色,文字の背景の順番に指定します.

順番

順番 場所
1,2 ディレクトリ
3,4 シンボリックリンク
5,6 ソケット
7,8 パイプ
9,10 実行形式
11,12 ブロックスペシャル
13,14 キャラクタスペシャル
15,16 setuid ビットが設定された実行形式
17,18 setgid ビットが設定された実行形式
19,20 他者 が書き込み可能なディレクトリ,スティッキービットが設定あり
21,22 他者 が書き込み可能なディレクトリ,スティッキービットが設定なし


色は次のような対応になってます.

それぞれ,大文字にすると太字になります.

  • a:ブラック
  • b:レッド
  • c:グリーン
  • d:ブラウン
  • e:ブルー
  • f:マゼンタ
  • g:シアン
  • h:ライトグレイ
  • x : デフォルト



例えば,ディレクトリの文字をシアンの太字, 実行可能ファイルをマゼンタの太字にしたければ次のように設定すれば行けます.

export LSCOLORS=GxfxcxdxFxegedabagacad

結果が次のようになります.

f:id:bokken31:20130923171710p:plain

自分好みに改変していくのは楽しそうですね.



起動時から設定する方法

自分のホームディレクトリの.bashrcに以下の二行を追加するだけでOKです.

alias ls='ls -G'
export LSCOLORS=GxfxcxdxFxegedabagacad

すると,起動時にも設定が反映されることになります.