2012-12-12 41 views
4

我正在處理一些小問題,並會就如何解決這個問題提供一些建議: 給定一個csv文件,列數和行數未知,輸出一列列表值和每個值重複的次數。無需使用任何庫。在ruby中處理大型CSV文件(20G)

如果文件小,這個不應該是一個問題,但是當它是一些演出,我得到NoM​​emoryError:無法分配內存。有沒有一種方法來創建一個散列並從磁盤讀取而不是將文件加載到內存?你可以做,與綁哈希

編輯的Perl:將IO#的foreach將文件加載到內存?那麼File.open(filename).each怎麼樣?

+1

這是一個工作任務?顯示你寫的代碼。 –

+0

只是想知道...你沒有接受答案,因爲沒有解決方案幫助?還是有另一個原因?這個問題剛剛出現在我的活動中,我想知道。 –

回答

6

你讀整個文件一次?使用ruby -peruby -ne$stdin.each應減少由被處理垃圾收集線的存儲器使用閱讀它在每線的基礎上的,即。

data = {} 
$stdin.each do |line| 
    # Process line, store results in the data hash. 
end 

保存爲script.rb和管道巨大的CSV文件到這個腳本的標準輸入:

ruby script.rb < data.csv 

如果你不覺得像我們需要一個小的變化的讀取標準輸入。

data = {} 
File.open("data.csv").each do |line| 
    # Process line, store results in the data hash. 
end 
+0

我正在尋找純粹的ruby版本,但這非常有幫助 – fenec

+2

@fenec,是什麼讓你認爲這個版本不純? – Jan

+0

哈哈哈也許是因爲我不知道如何使用它,如何將我讀文件 – fenec

20

閱讀文件的一行的時間,放棄每一行,當您去:

open("big.csv") do |csv| 
    csv.each_line do |line| 
    values = line.split(",") 
    # process the values 
    end 
end 

使用這種方法,你可千萬別出內存中運行。