2013-08-05 32 views
0

我試圖找出ruby腳本的瓶頸在哪裏。我懷疑它可能發生,因爲腳本解析數以千計的行,併爲每一行檢查磁盤中是否存在某個文件並最終讀取其內容。從磁盤讀取多次可能導致瓶頸

def sectionsearch(brand, season, video) 
    mytab.trs.each_with_index do |row, i| 

    # ...some code goes here... 
    f = "modeldesc/" + brand.downcase + "/" + modelcode + ".html"     
    if File.exist?(f) 
     modeldesc = File.read(f)              
    else                   
     modeldesc = ""                
    end 
    # ...more code here... 

    end 
end                   

由於沒有超過30個不同的「modelcode」文件成千上萬的記錄,我一直在尋找不同的方法(即讀取文件夾中的所有內容的每個循環之前,因爲它不會在執行期間改變)。

這種方法是否會加快我的腳本,這也是正確的方法來實現這個嗎?

+1

那麼你可以看看使用像ruby-prof這樣的東西來描述腳本,但一般來說,如果你每次點擊磁盤來檢查文件是否存在,它可能會成爲一個瓶頸。您可以閱讀整個目錄並存儲所有文件,然後查看它們。另一個選擇是緩存查找。因此,您在第一次查找時將磁盤命中,然後後續查找將更快。而且你不需要預先迭代所有品牌/模型。 – Doon

+0

@Doon,這看起來不錯。你會爲每個文件創建一個新的對象,或者將所有文件存儲在一個散列中,例如{:model_foo =>「 ...」; :model_bar =>「 ......」}? – TopperH

+0

模型文件有多大?他們的平均尺寸是多少,和/或最大尺寸是多少? –

回答

1

我可能會做一些這樣的哈希(通過塊),以檢查該文件,未知鍵:

def sectionsearch(brand, season, video) 

    modeldescrs = Hash.new do |cache, model| 
     if File.exist?(model) 
     cache[model] = File.read(model) 
     else 
     cache[model] = '' 
     end 
    end 

    mytab.trs.each_with_index do |row, i| 

    # ...some code goes here... 
    f = "modeldesc/" + brand.downcase + "/" + modelcode + ".html"     
    puts modeldescrs[f] 
    # ...more code here... 

    end 
end 

然後只需訪問modeldescrs[f]當你需要它(上述賣出期權就是一個例子)如果該鍵不存在,該塊將被執行,並且它將查找/填充它。請參見http://www.ruby-doc.org/core-2.0/Hash.html以獲取關於初始化程序塊形式的更多信息Hash

另外,如果需要保存,則可以將modeldescrs作爲實例變量。