yamazのRails日記 このページをアンテナに追加 RSSフィード

2010-05-12rubyのC拡張でzero copyなStringを取り回すのは難しい このエントリーを含むブックマーク

大量の文字列データ処理をする必要があって、pure rubyだといよいよきつくなってきたので、

C拡張で乗りきろうと思ったけど、いろいろあってうまくいかなかったのでその時のメモ。

# なおruby1.8系の話です。他は知りません。


結論としてはStringオブジェクトを作る際にzerocopy&CoWを期待してCレベルの文字列からrubyレベルのStringを作ろうとしても必ずしもzerocopyでStringを作れるとは限らないので期待するパフォーマンスは出ない可能性がある。


もうC++で解決したのだけど調査の際に色々分かったことを書いておく。



1. rubyStringはCからの利便性のため、内部の文字列には必ず\0がある.

オリジナルの文字列の終端に\0がない場合は強制的に\0を付与するため、その際にはmallocとmemcpyが発生する。


2. ある特定の条件のときにだけzerocopyでStringが作られる

この場合のある特定条件というのはよく分かってないが、1の事情があるので少なくとも文字列終端が\0で終わっている必要がある。


3. rubyStringにはCoW(Copy on Write)機能がある。

内部的にはzerocopyな文字列用のフラグ(?)があり,文字列にwriteが発生する時に始めてmallocが走ってコードになっている。

SunnySunny2013/01/14 00:37Super informative wirintg; keep it up.

zrhkcfzrhkcf2013/01/15 03:4979YDTG , [url=http://igkfglrxpcyh.com/]igkfglrxpcyh[/url], [link=http://qexjacxbevcl.com/]qexjacxbevcl[/link], http://chfplbugccdl.com/

jnmjptjnmjpt2013/01/16 11:06gA0l4Y <a href="http://pglnaastqkub.com/">pglnaastqkub</a>

トラックバック - http://rubyist.g.hatena.ne.jp/yamaz/20100512

2010-05-11postgresでロックしてたりするクエリを調べる方法 このエントリーを含むブックマーク

メモ

 SELECT
 procpid,
 start,
 now() - start AS lap,
 current_query
 FROM
 (SELECT
 backendid,
 pg_stat_get_backend_pid(S.backendid) AS procpid,
 pg_stat_get_backend_activity_start(S.backendid) AS start,
 pg_stat_get_backend_activity(S.backendid) AS current_query
 FROM
 (SELECT pg_stat_get_backend_idset() AS backendid) AS S
 ) AS S
 WHERE
 current_query <> ''
 ORDER BY
 lap DESC;

JeslynJeslyn2011/05/05 00:04Ppl like you get all the brains. I just get to say thanks for he aneswr.

bokhhyadbokhhyad2011/05/05 10:57J4rreV <a href="http://tbdmsvxuxkig.com/">tbdmsvxuxkig</a>

bcijacwotcbcijacwotc2011/05/06 10:56B71gO6 , [url=http://eorykantomgp.com/]eorykantomgp[/url], [link=http://roabxrpwyckw.com/]roabxrpwyckw[/link], http://vbsivdiccllx.com/

トラックバック - http://rubyist.g.hatena.ne.jp/yamaz/20100511

2010-01-23Postgresqlでn日後の日付を動的に取得する方法 このエントリーを含むブックマーク

schedules テーブル
end_at(最終日)
num_of_days(最終日からの日数)

というテーブルで最終日からnum_of_daysの日数を加えた日付を知りたい.

 select end_at + (num_of_days::TEXT || ' days')::INTERVAL from schedules;

これだった.

# 難しいよ Postgresql.

追記
select end_at::date + num_of_days from schedules;
でどうでしょう

こちらの方がスマートですね.date型は数値とやりとりできるのは知りませんでした.

## やっぱり難しいよ Postgresql

umitanukiumitanuki2010/01/26 14:59select end_at::date + num_of_days from schedules;
でどうでしょう

yamazyamaz2010/01/26 17:37なるほど!そちらの方がスマートですね!

AketiJyuuzouAketiJyuuzou2010/02/06 08:42こんな手もあります。
end_at + num_of_days * InterVal '1 day'

yamazyamaz2010/02/07 01:23> AketiJyuuzou
それもいいですね!

トラックバック - http://rubyist.g.hatena.ne.jp/yamaz/20100123

2009-11-22ディレクトリ配下の特定のファイルだけアーカイブする方法 このエントリーを含むブックマーク

自分用メモ絶対他にうまい方法があるはずなので,教えてください><;

やりたいこと.


/logs/yyyymmdd/hostname/*campaign_log*というファイルだけtarにしたい.ただし該当ファイル数が多すぎてshellでは取り扱えない.


戦略

  1. 空のtarファイルを作る
  2. 該当ファイル名を抽出してxargsとtarの追記オプション(-r)で処理

作業メモ

tarファイルを作る
% touch hoe
% tar cvf tmp.tar hoe #(A)
tarファイルに追記
 % ls -d /logs/200911* |xargs -t -i  find {} -name '*campaign_log*' > files.txt # (B)
 % cat files.txt |xargs tar fr ~/tmp.tar # (C)

解説

  1. (B)の代わりにfind /logs -name '200911*campaign_log*'としないのは余計なディレクトリを走査したくないからls -d /logs/200911* で該当ディレクトリを絞る.
  2. (B)のxargsの -t -i コマンド途中(つまり{}の部分)にコマンド引数を渡すためのオプション
  3. この方法だと(A)のコマンドの空tarファイル作成に使ったダミーファイルが残ります(´・ω・`)

znzznz2009/11/23 10:20GNU tar だと
-T, --files-from=FILE get names to extract or create from FILE
というオプションがあるようなので、
find -name '*log*' | tar -T - -cvf log.tar
みたいな感じでどうでしょうか?

sarumarusarumaru2009/11/23 12:43find の -depth option ではだめでしょうか

sarumarusarumaru2009/11/23 23:20なんとなく
echo /logs/yyyymmdd/hostname/*campaign_log* | xargs tar cf ~/tmp.tar
でいける気もしてきました。echo が built-in command なら。
ただしファイルの並び順は find とは変わってくるかも。

YamileYamile2012/05/25 15:10Wow! That's a really neat aswner!

uuzgkdynkliuuzgkdynkli2012/05/27 11:07RRT6cJ , [url=http://mndjwpvtwkal.com/]mndjwpvtwkal[/url], [link=http://zalqpgwrybdq.com/]zalqpgwrybdq[/link], http://ufghrfmbizha.com/

yurguefogzyurguefogz2012/05/28 17:2963MmRt <a href="http://qdjkpnatdpck.com/">qdjkpnatdpck</a>

rqaygtaigrqaygtaig2012/05/28 22:36rUHERY , [url=http://vuodkkylmiij.com/]vuodkkylmiij[/url], [link=http://egdtpfqyoqnq.com/]egdtpfqyoqnq[/link], http://vprklondxufm.com/

トラックバック - http://rubyist.g.hatena.ne.jp/yamaz/20091122

2009-08-30複数のコマンドをnohup&バックグラウンドで逐次実行させる方法 このエントリーを含むブックマーク

シェルにはnohup(No HungUp)というビルトイン関数があって,コマンドの前に付けることで回線断などの不具合があっても続行して実行してくれる.

今回複数のコマンドをnohupで逐次実行させようとしてちょっとはまったのでメモ.

% nohup command1; command2

これだと最初のコマンドだけしかnohupが効かない


% nohup command1 & nohup command2 &

これだとcommand1, command2の並列実行になるため,コマンドによっては効率が悪くなる.よって


% nohup sh -c 'command1 ; command2' &

が正解(他にも方法あるかな?)

(おしまい)

DalipDalip2012/10/16 07:09Lot of smtras in that posting!

makzvjmakzvj2012/10/19 14:03iTMklf , [url=http://dolwdxkideqh.com/]dolwdxkideqh[/url], [link=http://obaytxvejodo.com/]obaytxvejodo[/link], http://dwdwooiyquhu.com/

lewarfjhifflewarfjhiff2012/10/20 01:36vSrBF2 <a href="http://iapzwwefzrop.com/">iapzwwefzrop</a>

tmvwowtmvwow2012/10/20 11:47DlUtfO , [url=http://losspwhmhaqj.com/]losspwhmhaqj[/url], [link=http://qkeuxnggxizu.com/]qkeuxnggxizu[/link], http://fyuksckhlkbu.com/

トラックバック - http://rubyist.g.hatena.ne.jp/yamaz/20090830