【RoR】Ruby on Rails Part18
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2014/01/11(土) 20:04:00.68ID:???http://kohada.2ch.net/test/read.cgi/php/1382097427/
http://unkar.org/r/php/1382097427/
■参考サイト
<英語>
本家:http://rubyonrails.org
API document:http://api.rubyonrails.com/
開発者のblog:http://weblog.rubyonrails.org/
参考wiki:http://wiki.rubyonrails.org/rails
http://ruby-toolbox.com/
http://rubygems.org/
http://agilewebdevelopment.com/plugins/top_rated
<日本語>
Rails' wiki: http://wiki.fdiary.net/rails/
http://doc.ruby-lang.org/ja/1.9.3/doc/index.html
0711659
2014/07/20(日) 23:16:25.32ID:???Index使われてるかexplainでちゃんとみた?
まずこれの速度は実用に堪えるの?
これが数msで帰ってくるならボトルネックはactive_atではないってことになるよね?
@codes = Code.includes(:user).order("users.active_at DESC").page(params[:page])
まあ間違いなくここだろうけど、indexある状態とない状態で速度比較してみるといいよ
0712nobodyさん
2014/07/20(日) 23:31:37.31ID:qyCtqucUそのコードでもやはり表示されるのに数十秒かかりますね。
def self.up
add_index :users, :active_at
end
して
bundle exec rake db:migrate RAILS_ENV=production
まで実行したのに、これだけではindexは適用されていないということでしょうか?
0714nobodyさん
2014/07/20(日) 23:40:41.29ID:???そのSQL を二段階に分けるといい
ってリンクを貼るのをやめてくれ
前にSQLスレに流したときもこれが原因でRailsっはゴミて叩かれてた
0715nobodyさん
2014/07/20(日) 23:49:19.73ID:qyCtqucUdevelopmentではなく本番環境(とはいっても公開していませんが)でやってます。
ちなみに
communityのmodelに has_many :codes, belongs_to :user
codeのmodelに belongs_to :community, belongs_to :user
userのmodelに has_many :codes, has_many :communities
をアソシエーションにしています。
スコープ使って↓を実行すると即座にactive_atでソートがかかって表示されます(ただしcommunityは1つに限定されています)
@codes = @community.codes.recent.page(params[:page])
codeスコープ→ scope :recent, lambda { |n = 10| includes(:user).where('users.deleted_at' => nil).order("users.active_at DESC").limit(n) }
なので
@communities = current_user.get_up_voted(Community)
@codes = @communities.codes.recent.page(params[:page]) でいけるかな?と思ったら
案の定 undefined method `codes' のエラーになり四苦八苦してるところです
複数レコード→複数レコードで繋いで取り出すには
has_many through を使わないと、この問題は解決できないのでしょうか?
0716nobodyさん
2014/07/20(日) 23:52:56.59ID:???0718nobodyさん
2014/07/21(月) 01:02:06.23ID:???0719nobodyさん
2014/07/21(月) 01:10:38.34ID:???n to nリレーションでは間にリレーションテーブルを作るのがrdbmsの定石。
ActiveRecordだとhmt。
0720nobodyさん
2014/07/21(月) 01:43:44.00ID:B7gBtag6ありがとうございます。
codesは電話番号なんですが、
user has_many :codes になります
codeはuserに直接属して且つcommunityにも直接属しているのですが
communities.codes を実現させるには
こんな場合でもcommunityとcodesの間に中間テーブルが必須ですか?
0721nobodyさん
2014/07/21(月) 01:54:32.49ID:???user:code = 1:n
community:code = 1:n
ってこと?
それならいらない。
なんだかよくわからんが、ERDくらいは書けた方がいいと思う。
0722nobodyさん
2014/07/21(月) 02:01:33.12ID:B7gBtag6そういうことです
その関連アソシエーションですが
これを実行すると
40秒以上かかります
@communities = current_user.get_up_voted(Community)
@codes = Code.includes(:user).where(:community_id => @communities.collect(&:id)).order("users.active_at DESC").page(params[:page])
ちなみにusers.active_atにはindexが貼ってあります
0723nobodyさん
2014/07/21(月) 03:00:37.45ID:???0724nobodyさん
2014/07/21(月) 03:18:08.00ID:???http://nippondanji.blogspot.jp/2009/05/alter-table.html
0725nobodyさん
2014/07/21(月) 04:55:40.36ID:???馬鹿の自演か
0726nobodyさん
2014/07/21(月) 07:40:13.46ID:???TEXT や BLOB をもつテーブルではもっと悪くて、一時テーブルはディスク上に作られる
これには tmp_table_size や max_heap_table_size の設定は関係ない
そういう場合は、SQL を二段階に分けるといい
http://www.metareal.org/2007/07/24/notes-on-rubyonrails-with-mysql/
http://mysqldump.azundris.com/archives/72-Rubyisms.html
0727nobodyさん
2014/07/21(月) 11:36:17.22ID:???途中からだったら
以前のレコードにはindexは貼られず無意味だったんですねorz
色々と調べてみて分かりました
途中からindex追加する場合でも全レコードに適用できるものばかりと思っていました。。。。
0729nobodyさん
2014/07/21(月) 12:58:25.44ID:???0730nobodyさん
2014/07/21(月) 13:04:39.88ID:???0731nobodyさん
2014/07/21(月) 13:56:33.63ID:???おおよそ日本のものを生成したいのですが、下記のように頑張って少数一位までランダムにしたいと思ったのですが、うまくいきません
どういった方法でやればいいのでしょうか?厳密にはrubyということになりますが、宜しくお願いします
latitude = Random.rand(200..500).quo(10)
longitude = Random.rand(1200..1550).quo(10)
0732nobodyさん
2014/07/21(月) 17:13:20.23ID:B7gBtag6ありがとうございます。
こんなかんじです
+----+-------------+-------------+--------+---------------+---------+---------+---------------------------------------+------+----------------------------------------------+\n
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |\n
+----+-------------+-------------+--------+---------------+---------+---------+---------------------------------------+------+----------------------------------------------+\n
| 1 | SIMPLE | codes | ALL | NULL | NULL | NULL | NULL | 9095 | Using where; Using temporary; Using filesort |\n
| 1 | SIMPLE | users | eq_ref | PRIMARY | PRIMARY | 4 | test_production.codes.user_id | 1 | |\n
+----+-------------+-------------+--------+---------------+---------+---------+---------------------------------------+------+----------------------------------------------+\n
2 rows in set (0.00 sec)\n"
0733nobodyさん
2014/07/21(月) 17:14:18.84ID:B7gBtag6@codes = Code.includes(:user).where(:community_id => @communities.collect(&:id)).order("users.active_at DESC").explain
をconsoleで実施しました
0734nobodyさん
2014/07/21(月) 17:15:17.26ID:B7gBtag6@communities = User(1).get_up_voted(Community) ←current_userではなくUser(1)
@codes = Code.includes(:user).where(:community_id => @communities.collect(&:id)).order("users.active_at DESC").explain
をconsoleで実施しました
0735nobodyさん
2014/07/21(月) 17:33:01.50ID:???0738nobodyさん
2014/07/21(月) 18:20:09.52ID:???入れ子でremote=trueのformって入れられるの?
会員登録の際のアカウント重複の確認とかどうやってるのでしょうか?
0740nobodyさん
2014/07/21(月) 18:37:21.63ID:???えっ?add_indexを実施しても無意味だということですか?
上でindex付けてみるといいと助言をいただいたので試してみました
0742nobodyさん
2014/07/21(月) 22:31:13.01ID:???>>736
136.2とか132.6とかが発生せずに、132.0とか133.0とか少数第一位が0のものしか生まれません。
0743nobodyさん
2014/07/21(月) 23:00:22.18ID:???2014-07-21 3:23:00 UTC
のように登録されますが、
これをepoch(1970-01-01 00:00)を基準に、1970-01-01 3:23:00と登録させたりできないでしょうか?
0744743
2014/07/21(月) 23:26:03.35ID:???epochまわりに配置してもいろいろ大変そうなので、
任意のもの、2010-10-10 3:23と登録させるような方法はありますでしょうか?
0745nobodyさん
2014/07/22(火) 01:24:30.99ID:???1.attr_accesor かなんかで、buf_dateとかを作る
2.before_save :set_dateとかで保存時にbuf_dateを読む
3.その中でself.date = Date.new(2011-12-#{self.buf_date})とかやる
0751nobodyさん
2014/07/22(火) 23:09:05.35ID:???こういう変な規則の時バリデーションってどうやればいいのでしょうか?
0752nobodyさん
2014/07/22(火) 23:40:19.50ID:???条件付きvalidation使ってるね
サクッとやれるのは条件付きvalidationかも
4つ必要になる。
attr :xxx
validate :xxx, presence: true, unless: valid_input_cols?, message: 'col1,2,3はいずれか1つだけ入力が必要です'
validate :col1, numericality: true, if: (self.col1.preset? and valid_input_cols?)
validate :col2, numericality: true, if: (self.col2.preset? and valid_input_cols?)
validate :col3, numericality: true, if: (self.col3.preset? and valid_input_cols?)
def valid_input_cols?
count = 0
count = count + 1 if self.col1.preset?
count = count + 1 if self.col2.preset?
count = count + 1 if self.col3.preset?
count == 1 ? true : false
end
xxxはvalidationの便宜のために作った適当な仮想属性。col1とか使っても別にいいっちゃいい。
コードは適当なのでそのままでは動かんかも
あんまスマートなやり方でないので、他の人のやり方を知りたい
0754nobodyさん
2014/07/23(水) 00:07:07.25ID:???模索中ということなので、英語(validate presence one of)でググってこれはというものの、リンクを貼っておきます。ありがとうございました。
0755nobodyさん
2014/07/23(水) 00:08:26.78ID:???0757nobodyさん
2014/07/23(水) 13:45:42.51ID:???まず、生でSQL実行できる環境作って同じSQLで比較して
CREATE INDEXしたり EXPLAINしたりANALYZEかけたりしてみなよ
0758nobodyさん
2014/07/24(木) 00:06:49.37ID:I3rzKL5b@codes = Code.includes(:user).where('community_id IN (?)', @communities).order('users.active_at DESC').page(params[:page]).per(10)
のようにActive RecordでSQLを出力すると、ページが表示されるまでに40秒ほどかかります。
.order('users.active_at DESC’)を抜いて記述すると3秒で表示されるようになります。
@codes = Code.includes(:user).where('community_id IN (?)', @communities)
のようにして一旦全てを取り出して
これをRuby側で'users.active_at DESC’の要素で並び替えを行い.page(params[:page]).per(10)まで適用させるにはどのように記述すればいいでしょうか?
0759nobodyさん
2014/07/24(木) 00:16:38.22ID:I3rzKL5b心当たりとしては外国の誰からか
http://hoge-hoge-mysite.jp/hoge_action?WAC_SESSION=955037240569551118593488801844020631970859589704918509137566
ように意味不明なパラメーターを付けてアクセスされたことかなと見ています(アクセス解析ソフトにて判明)
WACやWAC_SESSIONとはなんなんでしょうか?
ActionController::RoutingError (No route matches [GET] "/WAC_CONTROL/WAC_MESSAGES/WAC_MSG_OVERVIEW"):
actionpack (3.2.11) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
actionpack (3.2.11) lib/action_dispatch/middleware/show_exceptions.rb:56:in `call'
railties (3.2.11) lib/rails/rack/logger.rb:32:in `call_app'
railties (3.2.11) lib/rails/rack/logger.rb:16:in `block in call'
activesupport (3.2.11) lib/active_support/tagged_logging.rb:22:in `tagged'
railties (3.2.11) lib/rails/rack/logger.rb:16:in `call'
actionpack (3.2.11) lib/action_dispatch/middleware/request_id.rb:22:in `call'
rack (1.4.5) lib/rack/methodoverride.rb:21:in `call'
0760>>759の続き
2014/07/24(木) 00:17:03.95ID:I3rzKL5bactivesupport (3.2.11) lib/active_support/cache/strategy/local_cache.rb:72:in `call'
rack (1.4.5) lib/rack/lock.rb:15:in `call'
actionpack (3.2.11) lib/action_dispatch/middleware/static.rb:62:in `call'
rack-cache (1.2) lib/rack/cache/context.rb:136:in `forward'
rack-cache (1.2) lib/rack/cache/context.rb:245:in `fetch'
rack-cache (1.2) lib/rack/cache/context.rb:185:in `lookup'
rack-cache (1.2) lib/rack/cache/context.rb:66:in `call!'
rack-cache (1.2) lib/rack/cache/context.rb:51:in `call'
rack-mini-profiler (0.1.23) Ruby/lib/mini_profiler/profiler.rb:209:in `call'
railties (3.2.11) lib/rails/engine.rb:479:in `call'
railties (3.2.11) lib/rails/application.rb:223:in `call'
railties (3.2.11) lib/rails/railtie/configurable.rb:30:in `method_missing'
unicorn (4.6.3) lib/unicorn/http_server.rb:552:in `process_client'
unicorn (4.6.3) lib/unicorn/http_server.rb:632:in `worker_loop'
unicorn (4.6.3) lib/unicorn/http_server.rb:500:in `spawn_missing_workers'
unicorn (4.6.3) lib/unicorn/http_server.rb:142:in `start'
unicorn (4.6.3) bin/unicorn_rails:209:in `<top (required)>'
/usr/local/bin/unicorn_rails:23:in `load'
/usr/local/bin/unicorn_rails:23:in `<main>'
0761nobodyさん
2014/07/24(木) 02:03:42.16ID:???他の人が回答してるけど、usersテーブルのactive_atにindex貼ればいいと思う。
index貼れば既存のレコードにも適応される。
@codes = Code.includes(:user).where('community_id IN (?)', @communities)
だけ一旦とりだして云々〜というのはできるけど辞めた方がいい。
SQLでやるよりずっと遅くなる可能性のが高い。
とにかく以下の2点をちゃんと確認する必要がある。
1. ホントにusersテーブルにindexが貼られてるかどうか。
2. クエリが発行されるときに当indexが利用されているか。
1は、適当なDBクライアントから、index確認のクエリをたたく。
MySQLなら
show index from users;
PostgreSQLやOracleは知らん。調べて。
2は、
rails consoleで
@communities = current_user.get_up_voted(Community)
explain = Code.includes(:user).where('community_id IN (?)', @communities).order('users.active_at DESC').page(params[:page]).explain
p explain
って感じで確認する。perはページネーションのメソッドだろうから外す。
闇雲にやってる感があるけど、この際だからSQLやindex,explainのことをある程度学んだほうがいい。
0762nobodyさん
2014/07/24(木) 07:27:07.95ID:???お返事ありがとうございます
�@についてはindexは貼りました
phpMyAdminのusersテーブル→構造→インデックス
から
ちゃんとactive_atのインデックスが作られて表示されているのを確認しました
その後、�Aについては
実行すると>>732のような結果でした
0765nobodyさん
2014/07/24(木) 12:14:47.84ID:???add_indexをbundle exec db:migrate RAILS_ENV=production した後
explainした結果が>>732です
0766nobodyさん
2014/07/24(木) 15:57:58.54ID:RxL1HHelactive_atのindex使われてないねぇ
MySQLのindexは、1つのtableにつき1つのindexしか使ってくれないって制限がある。
で、usersの方は active_at じゃなくて PRIMARY、つまり id のindexが優先して使われてるね。
test_production.codes.user_idって情報があるから、joinの結合のためだろう。
idとactive_atの順番で複合index張れば上手くindexが使われる「かも」。
MySQLだとこんな感じ。
alter table users add index multiple_idx (id, active_at);
「かも」なのは自分もちょっと自信がない部分があるから。
join後のtemporary tableに対して、indexって効いたかな?って。
762が実験するか、誰か詳しい人おしえてほし。
あと、codesもALLになっちゃってるね。
order部を外したら3秒ですむ、という話だけど3秒もかかるのはこのせいだね。
codesターブルのcommunity_idにindex貼れば ここは 0.1秒以下になると思う。
0767nobodyさん
2014/07/24(木) 18:47:42.92ID:???http://blog.tkmr.org/tatsuya/show/268-ruby-on-rails-10-tips
findメソッドはパワフルだけど基本SELECT * FROMなので場合によっては:selectで必要なカラムだけ読み込む、また:limitや:offsetを活用する
ごくごく基本的な Ruby on Rails のパフォーマンスチューニング
http://jijixi.azito.com/cgi-bin/diary/index.rb?date=20071114
:conditions オプションでキーに使われるようなカラムにはインデックスを作成すべし
:selectで取得するカラムを絞ったらパフォーマンスが倍に
http://brass.to/blog/active_record_select_option.html
レコード件数は110万件くらい
カラム数は30程度
インデックスは効いている(explainで確認済み)
Rails で MySQL を使うときの注意点 | METAREAL
http://www.metareal.org/2007/07/24/notes-on-rubyonrails-with-mysql/
SQL を二段階に分けるといい
まず、最初の SQL でレコードの ID だけを SELECT する(int だけなので、このときの一時テーブルはメモリ上に作られる)
次に、その ID で必要な TEXT や BLOB を SELECT するんだ(これは ID による単純な検索なので一時テーブルは使われない)
MySQLパフォーマンスチューニングのためのインデックスの基礎知識
http://d.hatena.ne.jp/kiyo560808/20101117/1289952549
0768nobodyさん
2014/07/24(木) 18:52:20.66ID:???http://gutch.hatenablog.com/entry/20120222/1329890161
0769nobodyさん
2014/07/24(木) 23:40:58.72ID:???community_idにindexを貼っても
やはり同じように重いですね
謎すぎます
解決方法が分かる人がいたら本当お願いします!
0771nobodyさん
2014/07/25(金) 00:35:05.24ID:???なんか重く感じます
unicornでprocess数は6にしています
さくらVPS SSD メモリ2GBに最適な
unicornとmysqlのmy.cfの設定法を教えてください
0772nobodyさん
2014/07/25(金) 00:48:52.93ID:???0773nobodyさん
2014/07/25(金) 05:06:17.56ID:???手元で書いて動くコードは1分でできるのに、
例外処理をして9割の完成度に上げるのには、とてつもなく時間がかかる場合がある
http://el.jibun.atmarkit.co.jp/rails/2011/09/web9-1e8b.html
スタートアップ企業で8年間Webの開発をしてみての反省点いろいろ - Masatomo Nakano Blog
6. サーバ周りの人材をしっかり確保しよう
http://b.hatena.ne.jp/entry/blog.madoro.org/mn/84
Ruby on Rails が簡単というのはウソ - #生存戦略 、それは - subtech
http://subtech.g.hatena.ne.jp/secondlife/20120309/1331279496
今すぐ辞めて欲しい、「Ruby on Rails勉強してます」「CakePHP勉強してます」 | つい全力ツッコミしてしまうエンジニアCEOのブログ | sumyapp
http://b.hatena.ne.jp/entry/blog.sumyapp.com/2013/07/no-recommend-rails/
自分でサーバ立てるのってなんか楽しそうだしスゴそうだよね?
サーバ立てるのなんてちょっとパソコンに詳しければ簡単にできるんでしょ?
ハードウェアの多重化なんて必要?
企業で使うとかじゃなく個人的に細々と立てたサーバが攻撃されることなんて滅多にないよね?
攻撃が来るって言ったって大した数じゃないんでしょ?
攻撃されたって大したことは起きないんでしょ?
http://b.hatena.ne.jp/entry/tmaeda.s45.xrea.com/20041101.html
0774nobodyさん
2014/07/25(金) 06:03:25.11ID:PIzM/Roo0775nobodyさん
2014/07/25(金) 07:25:11.19ID:???>サーバ立てるのなんてちょっとパソコンに詳しければ簡単にできるんでしょ?
マイクロソフトはOS会社なのに
そのノリでサーバー作ってるフシがあるから困るわ
0776nobodyさん
2014/07/25(金) 10:36:19.12ID:???それはその機能ですか
0779nobodyさん
2014/07/25(金) 19:40:03.54ID:jnnPzTtojavaであればServletやspringのシングルトンActionにインスタンス変数を持たせると
スレッドセーフでなくなり、無関係なユーザの情報が混ざってしまったりするので、
そのような実装をしないように注意したりしますが、
railsでもそのような注意点があれば教えてください。
0780nobodyさん
2014/07/25(金) 23:08:32.42ID:???0781nobodyさん
2014/07/26(土) 21:45:38.66ID:???0782nobodyさん
2014/07/27(日) 00:28:37.21ID:f1pmoydYRails 2.1 頃の情報だけど(最新は知らない)、
Railsは(Java Servlet等とは違って)シングルスレッドだよ
WebサーバからControlerが起動されると、
Viewがレンダリングを終えるまで呼び出したスレッドが占有する
いいかえると、一度に1つのHTTPリクエストしか処理しない
だからRailsプログラマはスレッド間の競合/排他などについて悩まない
実運用では、Webサーバの背後で複数のAPサーバ(Railsインスタンス)を
配置することで、HTTPリクエストを並行に処理させるのが一般的
0783nobodyさん
2014/07/27(日) 01:08:28.48ID:???今はマルチスレッドで動かすこともできるサーバもあるしね(Pumaとか)
もっとも、MatzRubyはGILがあるからあまり意味はないんだが
0784nobodyさん
2014/07/27(日) 08:11:28.09ID:???超高速取引でウォール街を席巻する『フラッシュ・ボーイズ』
http://www.huffingtonpost.jp/shumpei-kumon/flash-boys_b_5210449.html
0785nobodyさん
2014/07/28(月) 19:46:24.40ID:tREUFgeDPayment.statuses.keysとかでselectタグに出力すると
日本語でセレクトタグに表示がされないでいい選択肢が無いな、と悩んでいます
ActiveRecrod#enumに対してささやかにi18nをかぶせてくれるようなgemは存在しないのでしょうか?
0786nobodyさん
2014/07/28(月) 19:59:19.99ID:yO+mRs5E0787nobodyさん
2014/07/28(月) 20:20:30.08ID:???http://b.hatena.ne.jp/entry/postd.cc/why-go-is-not-good/
Farewell Node.js (翻訳) - from scratch
http://b.hatena.ne.jp/entry/yosuke-furukawa.hatenablog.com/entry/2014/07/06/094617
0788nobodyさん
2014/07/29(火) 08:44:20.35ID:???http://jocellyn.cz/2014/07/28/best-gems-for-beginners.html
0789nobodyさん
2014/07/29(火) 14:17:10.87ID:???プロセス数は何個で設定してますか?
CPU仮想2コア
メモリ2GB
SSD
なんですが6で設定しています
多すぎ?2にすべき?
0790nobodyさん
2014/07/29(火) 19:49:14.83ID:???0791nobodyさん
2014/07/29(火) 20:23:46.40ID:???http://b.hatena.ne.jp/entry/blog.mirakui.com/entry/2013/02/20/003401
0792nobodyさん
2014/07/29(火) 20:40:27.84ID:???3c3
< worker_processes 1
---
> worker_processes 17
https://github.com/mirakui/tuningsan
0794nobodyさん
2014/07/29(火) 21:23:21.58ID:???http://b.hatena.ne.jp/entry/s/speakerdeck.com/mirakui/quan-zi-dong-parametatiyuningusan
0795nobodyさん
2014/07/29(火) 21:28:00.59ID:???webサービスを立ち上げた頃に既に idにindexを貼っていました。
そして、その後、add_indexさえすればというバカの1つ覚えで
意味が無いとも知らず同じテーブルの他のカラム(ただしアソシエーションのキーになるもの)
にも貼っておりindexが6種類ほど貼られています。
この状態で
alter table users add index multiple_idx (id, active_at);
を試したところ
mysql> alter table users add index multiple_idx (id, active_at);
Query OK, 9630 rows affected (0.84 sec)
Records: 9630 Duplicates: 0 Warnings: 0
と出ました。その後、indexが効いたか試しても、やはり>>701のように40秒以上かかります
どうしたらいいものでしょうか。。。どなたか分かる方いませんか?
0796nobodyさん
2014/07/31(木) 00:22:53.92ID:RKyjBma/開発環境と本番環境はdb/seeds.rbで作ってますが、テスト環境だとテストのたびに毎回リセットされちゃいます。
そしてこのseedsを入れ込むのに1分以上かかります。
テストのDBの特定のテーブルのデータだけリセットせずにずっと残しておくことは出来ないでしょうか。
0797nobodyさん
2014/07/31(木) 12:06:57.77ID:???dbのやりとりで重くなるとかじゃなくて
レンダリングだけでもクソ重い気がするbootstrapを使ってるせいかな?
0798nobodyさん
2014/07/31(木) 12:13:22.09ID:???CakePHPのほうが圧倒的に速いという
驚愕の事実
0799nobodyさん
2014/07/31(木) 12:29:50.73ID:???0800nobodyさん
2014/07/31(木) 12:47:13.91ID:???違うフレームワークじゃないのか
0801nobodyさん
2014/07/31(木) 14:21:00.11ID:???cakephpは毎回全ファイル読み込むからrailsと同じシステム作ったらrailsより早くなりようがないんだが
0802nobodyさん
2014/07/31(木) 14:36:15.65ID:???それならCakePHPのが早いケースも普通にあるだろうな(3倍くらい早くなる)。
Railsはproduction modeだと、ファイルのメモリキャッシュやるけどプリコンパイルまでしてるわけじゃないからな。
CakePHP + APC >> Rails production > CakePHP > Rails development みたいな感じだと思う。
Rubyはプリコンパイル難しい言語だからな。RubyVM開発者たちの更なる頑張りに期待するしかない。
YARVはRailsではあんま恩恵なかったね;;
0803nobodyさん
2014/07/31(木) 14:57:00.14ID:???例えば、「is_lock」をtrueにしたらそれ以降はupdated_atは更新されないってかんじです
既に動いてしまっているサービスなので別にもう1カラム追加するっての以外で方法があれば教えて下さいお願いします
0804nobodyさん
2014/07/31(木) 18:45:49.26ID:???0805nobodyさん
2014/07/31(木) 18:48:08.87ID:???http://gihyo.jp/dev/column/01/prog/2010/030801?page=2
RailsとCakePHPを比べたところ,高負荷時にはRails のほうが大幅に応答性能が高いという結果が出たことですね。
これは200リクエスト/秒くらいからPHPの応答性能が急激に下がるのが原因です。
Rubyはそれほど大きくはパフォーマンスが落ちないんです。
第4回 Railsに変えてよかった!:iKnow!の場合 | Think IT
http://thinkit.co.jp/article/156/4?page=0,1
3ヶ月、わずか3名程度のエンジニアチームで、彼らはPHPで実装が完了していたレベルに追いつきました。
またコード量はPHPの1/5以下にまで削減されており、よりシンプルな構成も実現できました。
食べログの画面数は約200あるが,開発に取りかかって約2カ月で完成した。
「VBscriptならこの倍,PHPでも1.5倍はかかっていたのではないか」
コード量も10分の1になった。
http://itpro.nikkeibp.co.jp/article/OPINION/20071031/286028/
0806nobodyさん
2014/07/31(木) 19:17:38.94ID:+eUxrmGz長引いてるね。興味あるんでちょっと実験してみた
コンソールであなたが提示してるのとほぼ同意の、以下のコード動くような環境を作った
page = 1
@communities = Community.get_up_voted(Community)
@codes = Code.includes(:user).where('community_id IN (?)', @communities).order('users.active_at DESC').page(page).per(10)
レコード数はそれぞれ
users: 1000
communities: 1000
codes: 100000
Community.get_up_votedは、適当なCommunityを100件戻すようにした。
が、0.1秒以下で結果が戻ってくる。流石に件数が少なすぎるのかもしれん。
それぞれの大体のレコード数 教えてくれ。
あと、Community.get_up_voted では大体何レコード位戻ってくる?
0807nobodyさん
2014/07/31(木) 20:38:11.55ID:???ありがとうございます
レコード件数は以下の通りです
Users 10000件
Communities 100件
Codes 10000件
Votes 100000件
0808nobodyさん
2014/07/31(木) 21:17:29.48ID:???@communities = current_user.get_up_voted(Community)
です
@communities = Community.get_up_voted(Community)
ではありません
0809nobodyさん
2014/07/31(木) 21:52:53.44ID:???current_user.get_up_votedの部分は要はいくつかのCommunityを戻すことが目的のメソッドよね?
で、ここはボトルネックにはなってない(ハズ)なので、適当に書いた。
特殊な処理してない限りは違いは現れないはず。
users 10000, codes 10000 でやっても 0.1秒以下で終わる。
explainの結果も、あなたが>>732で提示したのと全く同じ状態。
疑問を狭めるため、いくつか質問。
1. @communities の中身って CommunityのArray?それともActiveRelationオブジェクト?
2. sql = Code.includes(:user).where('community_id IN (?)', @communities).order('users.active_at DESC').page(page).per(10).to_sql
をやって、sqlの内容を教えて欲しい。
0810nobodyさん
2014/07/31(木) 22:47:39.55ID:O8Sk0a9qrandom.new.rand.quo
で解決しないか?詳しくないのでテキトーだが
■ このスレッドは過去ログ倉庫に格納されています