2013-02-01 108 views
6

我已經看到了這個問題的答案,但我無法弄清楚哪個答案會表現最快。這些是我見過的答案 - 哪個最好?使用每個或each_line 在Ruby中讀取大文件的最快方法是什麼?

  • 使用在時間讀取一行在一個時間

    1. 讀取一行得到
    2. 保存所有到使用readlines方法線的陣列,然後使用每個
    3. 使用grep(不知道與grep究竟是什麼......)
    4. 使用sed(不知道究竟是什麼與sed ...
    5. 還有其他?

    另外,使用其他語言還是應該更好?

    編輯:

    更多細節:每行包含類似 「ID1 attr1_1 attr2_1 ID2 attr1_2 attr2_2 ... IDN attr1_n attr2_n」(n是非常大的),我需要那些插入到數據庫中。對於該示例行,我需要將n行插入到數據庫中。

  • +6

    什麼是「大」文件?你在做什麼?表現是否重要?你有沒有嘗試過基準測試? –

    +0

    至少* 500,000行和每行數萬個字符。對於每一行,我都會對數據庫做些什麼。性能確實很重要。我沒有做任何基準測試,但我想知道是否有明顯的答案,根據他們的工作方式,哪些答案會更快或更慢。 – user1136342

    +0

    該文件是本地文件嗎? – gmalette

    回答

    4

    對於前三個選項,Ruby可能會使用相同或非常相似的低級代碼(用C語言編寫)從磁盤進行實際讀取,因此它們應該具有相似的性能。鑑於此,您應該選擇最適合您的方式;這樣做的能力使得像Ruby這樣的語言非常有用!您將讀取磁盤上的數據批次,因此我建議在讀取它時使用each_line並處理每行。

    我不建議把grepsed,或任何其他這樣的外部事業進入畫面,除非你有一個非常充分的理由,因爲它們會使你的代碼的可移植性和揭露你的失敗,可能很難診斷。

    2

    如果您使用的是Ruby,那麼無需擔心性能。這種語言適合於逐行讀取文件的迭代方法,並且工作得非常好。只要你按照設計的方式使用語言,就可以讓翻譯人員擔心表演。任務完成。

    如果需要一個特定的readLargeFileFast方法,那應該是因爲它確實阻礙了程序。現在,你編寫一個C程序來完成它,並將它作爲你ruby代碼中的一個單獨的過程。你可以稱它爲read_large.c,並且(可能)使用命令行參數來告訴它如何表現。

    這是倡導腳本語言用於快速開發而不是快速運行時間的想法。因爲這樣的開發人員可以通過像Ruby那樣快速「原型化」程序來提高生產力,只有在稍後重寫組件才能保證一些低級代碼。然而,通常情況下,一旦它在腳本中工作,就沒有必要做任何其他事情。

    Ruby Docs描述啓動一個單獨的進程並將其視爲一個文件。這很容易 - 太好了!一個好的開始是Linux藝術編程的介紹性段落program modularity。本書也是使用linux標準流編輯器的一個很好的例子,稱爲sed,你現在可以從Ruby中使用它。

    如果您需要解析或編輯大量文本,那麼許多解釋器或編輯器都是圍繞sed的功能編寫的。此外,如果你不知道C,它可以爲你節省很多的精力,寫出超高效率的東西。好的是Bruce Barnett的Introduction to SED

    相關問題