2012-08-10 41 views
1

我的問題是這樣的:我有一些非常大的數據文件(總額達數千兆字節),其中,除了實際的數據,包括文件的開頭有一些註釋行。從開始的文本文件中刪除意見,Ruby或以其他方式

因此,他們是這樣的:

# This is a file containing data. 
# Here's how to use it: 
# ... 
# Now, let's get to the actual data: 
DATA DATA DATA 

我試圖完成的任務是儘快刪除這些文件的意見,因爲該工具,我用它來他們攝取到我的數據庫不能處理評論。

我目前的方法是這樣的:

# For each data file... 
system "sed '/^\\#/d' #{filename} > #{filename}.tmp" 
system "mv #{filename}.tmp #{filename}" 

這工作,但它需要約1小時的總,因爲文件太大。我的假設是,必須有這樣做的更有效的方式,因爲我知道肯定意見是只是剛剛開始的文件,所以沒有必要搜索整個文件他們。

我不在乎太多的解決辦法是使用純Ruby,或像上面的shell命令,只要它比目前的方法更快。

回答

0

是的,你可以做這樣的非常快,我想你只希望有#了,否則適應,但要記住,寫入字符串需要準確只要讀取字符串。

File.open('big.txt', 'rb+') do |file| 
    loop do 
    line = file.readline 
    if (line[0]=='#') 
     file.seek(-line.length, IO::SEEK_CUR) 
     file.write line.sub!(/#/," ") 
    else 
     break 
    end 
    end 
end 
+0

對不起,澄清,我想刪除整個評論的行,而不是'#'。我不想用空白替換這行,我想完全刪除它。 – 2012-08-10 16:18:36

+0

沒有問題,然後通過dummyrecords替換註釋的線條,這是你知道的唯一途徑,這樣你做一個在線更換,原來的文件保持不變,所有其他解決方案涉及整個文件的複製,它總需要一些時間。您可以從數據庫中清除虛擬記錄。數據結構如何結構化?在哪個數據庫中以及如何導入? – peter 2012-08-10 19:40:22

0

嗯。你的方法是健全的。分離系統工具是大文件的一個很好的策略。

我想知道這樣一個簡單的轉碼可以怎麼會這麼慢。有些事情要探討...

  • 你確定sed(1)步驟是緩慢的部分?如果它真的是很慢的進口,確保您不會使每行到一個單獨的事務
  • 是某種類型的網絡捲上的文件?如果是這樣,你可以在服務器上而不是客戶端上運行腳本嗎?
+0

我再次檢查了總文件夾的大小,這是一個高達90千兆字節。所以我認爲其實就是這樣。他們不在網絡上,我確定這是'sed'步驟緩慢。我想知道的是,如果沒有一些方法可以在不重寫整個文件的情況下切斷開頭的行。 – 2012-08-10 14:21:31

+0

否。標準文件系統API只支持最後截斷。如果你想從頭開始刪除,你必須讀寫整個文件。但是,這還不應該花一個小時。更像是十分鐘。 – 2012-08-10 14:53:10