2015-11-21 102 views
1

我正在通過播種〜10,000條記錄來測試網站的性能。大結果Ruby on Rails

我想將它們全部渲染到一個輸出頁面。

假設我有一個User模型(10,000個用戶),我想將它們全部渲染到一個頁面(假設假設我希望它們全部預先加載到搜索框中,所以我需要全部的記錄一次,我知道有這個確切的例子的解決方案,但繼續...)。

幾個問題:

  1. 如何batch找到工作,是有一些方法我可以通過增加自動發現在控制器/模型級別和較小的增量這些記錄(在背景中)不滾動或分頁到視圖?

  2. 我不需要來自用戶的所有數據,所以我也可以使用.pluck。舉例來說,理論上我可能已經能夠做User.pluck(:date_or_birth),但是如果我有一個的age方法,其中user.age將返回基於.date_of_birth屬性的年齡整數。有沒有一種像pluck這樣輕巧的方法,可以讓我們抓取方法(即.pluck_method(:age))。我在這裏遇到的問題是,我想要顯示的一些內容不是屬性,但是我可以採用屬性並執行任何屬性操作,如helper

  3. 如果我使用pluck,我的集合現在是array而不是ActiveRecord散列,最好是轉換爲hash還是隻按順序訪問數組?

只是試圖儘可能快地創建幾個不同的網站,通常代碼是快速的,但我需要它需要與規模操縱。

回答

2

隨着數據集的增長,將所有記錄呈現爲單個頁面將不可避免地成爲可行的解決方案。您最終會遇到有限的服務器端資源/處理時間的邊界,並且會遇到Web客戶端的限制。當然,你需要做自己的分析和基準測試來確定邊界的位置。在此之前,這裏有事情,回答你的問題:

  1. (一)Rails提供的ActiveRecord的::關係的.find_each方法。它會將大型查詢批量化爲較小的卡盤(默認情況下爲1000條記錄),以避免過度使用數據庫並將整個數據集一次加載到內存中。您的查詢可能如下所示:User.find_each(batch_size: 2000)Read more on find_each here。也可以在同一頁面上看看find_in_batches

    (b)find_each只能解決一半的問題,因爲Rails在將內容發送回客戶端之前呈現整個頁面視圖和模板。 ActionController::Streaming提供增強功能,可在頁面呈現時遞增地將頁面的各個位發送回客戶端。

    流處理通過先渲染布局並在處理佈局的每個部分時對其進行流式處理,從而顛倒渲染流。這使得HTML(通常在佈局中)的頭部可以非常快速地傳輸回客戶端,從而允許JavaScript和樣式表比平常更早加載。

    這種方法是在Rails 3.1中引入的,並且仍在改進中。幾個Rack中間件可能無法正常工作,您需要在流式傳輸時小心。這些要點即將解決。

    爲了使用流式傳輸,您需要使用支持光纖的Ruby版本(從主要Ruby實現版本1.9.2開始支持光纖)。

    (c)我強烈建議你也看看一些各種緩存技術,以避免重新渲染視圖,甚至打到數據庫。 rails caching guides提供了可能適用於您的項目的不同技術的完美概述。

  2. 可以使用select方法,而不是pluck限制從數據庫中檢索到你感興趣的一個或多個數據庫列中的數據。Select將返回一組的ActiveRecord的,就像一個典型的查詢惟獨指定屬性將被填充到內存中。用select(:date_of_birth)您可以使用user.age方法。

  3. select對你來說可能是更好的解決方案。有一點需要記住的是,爲每條記錄實例化AR對象將增加所需的內存,並使用額外的CPU週期,與使用pluck的簡單陣列相比。