Ruby 初心者スレッド Part 36at TECH
Ruby 初心者スレッド Part 36 - 暇つぶし2ch362:デフォルトの名無しさん
10/04/04 14:42:20
system("make")等でmakeを実行しつつログを保存したいのですが
良い方法はないでしょうか?IOクラスのパイプとかリダイレクトとか良く分からなくて…

text=`make`ではmakeの出力がリアルタイムで確認できず
system("make 2>&1 | tee hoge.txt")では、$?でmakeの戻り値を
取得できなくなってしまうので困ります(失敗したらexitしたいのです)。

363:デフォルトの名無しさん
10/04/04 14:52:42
>>362
1.8 なら fork と exec で自分でがんばるしかないと思う。
1.9.1 なら spawn で、1.9.2 なら open3 で、できるかもしれない。

364:デフォルトの名無しさん
10/04/04 15:32:31
spawn for legacy
URLリンク(github.com)

365:デフォルトの名無しさん
10/04/04 17:33:45
Structを要素とする2次元配列の消費メモリが大きくて困っています
500個 * 約13000個 * 要素数5の構造体(整数4つ+文字列)のデータで
2Gbyte以上消費します(Cで書けば150Mbyte程度で収まる)

Rubyではこの程度のメモリ消費は普通なのでしょうか?
あるいは使い方やコツ等が分かっていないのでしょうか?
環境はruby1.8.7 on MacOSXです

366:362
10/04/04 17:34:10
>>363>>364
ありがとうございます。1.9.1だったので以下のようにしてみました。
こういうコードでいいのか分かりませんが、とりあえず目的は達成できました。

r,w = IO.pipe
pid = spawn("make", STDOUT=>w)
spawn("tee build.log", STDIN=>r)
ret = Process.waitpid2(pid)[1].to_i
w.close
if ret != 0
puts "[Error] (build) #{src}"
exit 1
end

367:デフォルトの名無しさん
10/04/04 17:40:08
>Rubyではこの程度のメモリ消費は普通なのでしょうか?

普通

368:デフォルトの名無しさん
10/04/04 18:56:57
ruby1.8.7がruby1.9系の良いところをフィードバックしたバージョン
rails3がruby1.9対応だからみんなそれまでは焦って動くことはなさそう。

メモリ消費でCと比べるのはrubyがかわいそう
javaだってcの10倍以上使っておかしくないんだぜ?
ruby1.9系が1.8系よりも良い所って
今のところガーベージコレクションが良いって記事しか読んだ事無いな。


369:デフォルトの名無しさん
10/04/05 10:54:00
>>366
わざわざtee使って複数プロセスにするから面倒な事になるんだろ。

ret = IO.popen("make", "r") {|mk|
open("build.log", "w") {|log| IO.copy_stream(mk, log)}
Process.wait2(mk)[1]
}
unless ret.success?
abort "[Error] (build) #{src}"
end

IO.copy_streamがなければそのくらい作れ。


370:デフォルトの名無しさん
10/04/05 10:55:53
あ、teeになってないな、これだと。
copy_streamの代わりにこうでもしてくれ。
mk.each{|line| log.puts(line); puts(line)}


371:365
10/04/05 17:58:32
>>367,368
そうですか・・
倍程度かなと勝手に予想してましたが、そんなに甘くはないですね
ありがとうございました。

372:デフォルトの名無しさん
10/04/05 22:51:12
書きやすくて実行しやすくてなおかつ投げ出したくならない程度の実行速度も求めた結果、
Ruby においてはメモリはすっげぇ大量に消費される

ご存知の通り、プログラムにおいて実行速度とメモリ使用量はトレードオフだ
どっちも良くしたい場合はアセンブラかせめて C で書か「ねばならない」

大量のデータを処理するのでなければ常識的な範囲内に収まるものではあるのだが、
大量のデータを処理することが事前にわかっているのなら Ruby を使わないほうがたぶん幸せ

373:デフォルトの名無しさん
10/04/05 23:17:25
馬鹿な事いってんじゃないよ、
ムーアの法則知らないのか?
それは、10年前のpcの話だろ

374:デフォルトの名無しさん
10/04/05 23:22:18
>>373
何言ってるの
いつの時代もCPUは100パーセント使用されるし
メモリはスワップにまで突っ込むし
HDDは90%まで埋まるもんだよ

10年前のデータ量を現在のマシンで取り扱うなら、君の言ってることは真だろうね

375:デフォルトの名無しさん
10/04/05 23:34:47
ムーアの法則を知っていてパーキンソンの法則を知らないのはニワカ


376:デフォルトの名無しさん
10/04/05 23:35:36
>>372
大量のデータでまったく同じ処理を何回もするならそうかも知れない
(大量の定義にもよるが)
あるいはとにかく速さを要求されるならそうかも知れん
ただ,大量のデータでもそんなに何度もしないならRubyの方が幸せかも知れん

たとえばRubyで処理に1日かかってアセンブラなら半分の時間でできるとしよう
coding/debug でその差以上得しなければ時間的にさえ得にならない
人件費ではさらに得にならない

coding のオーバーヘッド評価しないと意味が無いから状況に依りすぎる

有名な教訓を思い出すなぁ
"premature optimization is the root of all evil"

377:デフォルトの名無しさん
10/04/05 23:45:13
>>374
いわゆるデスクトップ版Linuxを使ってるとその思いが強くなる

10年くらい前は「もうちょっとマシンが早かったらこれすげえ快適なんじゃね!?」と思い
5年くらい前には「もうちょっとマシンが早かったらこれすげえ快適なんじゃね!?」と思い
今年インストールしたLinuxでも「もうちょっとマシンが早かったらこれすげえ快適なんじゃね!?」と思ってる

378:デフォルトの名無しさん
10/04/05 23:59:29
>>377
いいかげんマシン買い換えようよ

379:デフォルトの名無しさん
10/04/06 00:31:18
>>378
えっ


380:デフォルトの名無しさん
10/04/06 14:16:53
今すぐtwmに変更するんだ!

381:デフォルトの名無しさん
10/04/06 15:39:04
通年重いのはツールキット部分だな
起動するGUIアプリケーションが全部OpenMotif使うようになるとかなら歓迎だがそうでもあるまい

382:デフォルトの名無しさん
10/04/06 18:11:00
Ruby 使うって時点で GTK だったりするのがアレだ罠


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch