簡體   English   中英

Ruby自定義拆分功能慢

[英]Ruby custom split function slow

我有一個很大的文件,大部分都是用空格分隔的數據,我想將其解析為哈希。 問題是這主要是用空格分隔的,因此一個簡單的string.split無法正常工作。

這是文件中各行之一的簡化​​示例:

field0 field1 [ [field2a] [field2b] ] field3

外括號(包括外括號)中包含的內容必須是哈希成員。

我編寫了以下函數,該函數可以運行,但是非常慢:

# row = String to be split
# fields = Integer indicating expected number of fields
def mysplit (row, fields)

 # Variable to keep track of brackets
 b = 0

 # Variable to keep track of iterations for array index
 i = 0

 rowsplit = Array.new(fields)
 rowsplit[0] = ""
 row.each_char do |byte|

  case byte

   when ' '
    if b == 0
     i += 1
     rowsplit[i] = ""
    else
     rowsplit[i] += byte
    end

   when '['
    b += 1
    rowsplit[i] += byte

   when ']'
    b -= 1
    rowsplit[i] += byte

   else
    rowsplit[i] += byte

  end

 end

 if i != fields - 1
  raise StandardError,
   "Resulting fields do not match expected fields: #{rowsplit}",
   caller
 elsif b != 0
  raise StandardError, "Bracket never closed.", caller
 else
  return rowsplit
 end

end

在7 MB文件長6600行上運行此文件需要36秒。 值得一提的是,我的環境正在運行Ruby 1.8.7,我無法控制它。

有可能使它更快嗎?

您需要.squeeze.strip

str = "  field0     field1 [ [field2a] [field2b] ] field3"

puts str.squeeze.strip
#=> "field0 field1 [ [field2a] [field2b] ] field3"

壓縮會將任何多余的空白壓縮到僅1。條帶將刪除行的開頭和結尾空間。

從那里,您應該能夠使用正則表達式模式匹配將每一行解析為您要創建的數據結構,但是如果不知道如何解析數據,我將無濟於事。

您還應該盡早提高期望,而無需遍歷整個文件。

如果您知道自己在行中將在示例中匹配此模式:

if str.squeeze!.strip! !str[/\w+\ +\[\ +\[+\w+\]\ \[+\w+\]\ \]\ \w+/]
  raise StandardError, "Raise this string pattern is wrong #{str}"
end

如果你很好,那么你可以分裂或其他:

str.split(' ')
#=>["field0", "field1", "[", "[field2a]", "[field2b]", "]", "field3"] 

要真正調整代碼,您可以使用基准測試模塊來查找瓶頸。

但我希望您代碼的最大問題是字符串添加:

rowsplit[i] += byte

紅寶石解釋器將其翻譯為

rowsplit[i] = rowsplit[i] + byte

這將為輸入文件中的每個字節創建一個新的字符串對象。 因此,一個7MB的文件會創建並銷毀700萬個字符串對象...使用字符串串聯方法可能會足夠快:

rowsplit[i] << byte

請注意<<更改原始對象,這在您的程序中不是問題,但是在其他上下文中使用它時可能會出現問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM