2013-09-26 71 views
3

我有一個相當大的CSV文件,有400萬條記錄,375個字段,需要處理。 我正在使用RUBY CSV庫來讀取此文件,它非常緩慢。我認爲PHP的CSV文件處理速度很慢,但比較兩次讀取PHP的速度要快100倍。我不確定我是否在做一些愚蠢的事情,或者這只是RUBY未針對此類批處理進行優化的實際情況。我設置了簡單的測試pgms來獲得RUBY和PHP的比較時間。我所做的只是閱讀,不寫作,不建立大型數組,並在處理50,000條記錄後突破CSV讀取循環。是否有其他人遇到過這個性能問題?爲什麼Ruby CSV文件讀取速度很慢?

我在本地在MAC上的內存4gig運行,運行OS X 10.6.8和Ruby 1.8.7。

Ruby的過程需要497秒簡單地讀50,000條記錄,PHP進程在4秒這是不是一個錯字運行時,它的速度更快,更多的則100倍。僅供參考 - 我有循環中的代碼來打印數據值,以確保每個進程實際上正在讀取文件並將數據帶回。

這是Ruby代碼:

require('time') 
require('csv') 
x=0 
t1=Time.new 
CSV.foreach(pathfile) do |row| 
    x += 1 
    if x > 50000 then break end 
end 
t2 = Time.new 
puts " Time to read the file was #{t2-t1} seconds" 

這裏是PHP代碼:

$t1=time(); 
$fpiData = fopen($pathdile,'r') or die("can not open input file "); 
$seqno=0; 
while($inrec = fgetcsv($fpiData,0,',','"')) { 
    if ($seqno > 50000) break; 
    $seqno++; 
} 
fclose($fpiData) or die("can not close input data file"); 
$t2=time(); 
$t3=$t2-$t1; 
echo "Start time is $t1 - end time is $t2 - Time to Process was " . $t3 . "\n"; 
+2

你的問題到底是什麼? – 2013-09-27 00:03:20

+1

首先升級你的Ruby。 1.8.7有一個緩慢的CSV,再加上,與今天的Ruby v2.0相比,它的速度很慢。 –

+0

邁克,我試圖找出是否有其他人遇到這個性能問題,如果他們已經能夠解決它?正如錫文指出,它可能與我的版本有關,因爲1.8.7有一個緩慢的CSV庫。 – Eric

回答

5

您只需更新到Ruby的當前版本可能會得到一個巨大的速度提升。在版本1.9中,FasterCSV被集成爲Ruby的標準CSV庫。

退房Chruby管理不同Ruby版本。

0

我覺得用CSV是有點矯枉過正了這一點。

很久以前我看到了這個問題,爲Ruby的緩慢的原因在於,它加載整個CSV文件到內存中一次。我看到一些人通過使用IO class來解決這個問題。例如,請參閱this gistself.perform(url)方法。

+2

'CSV.foreach'每次只讀一行。請參閱:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV.html#label-A+Line+at+a+Time – Momer

+0

大聲笑我完全忽略了這一點。我確信CSV.foreach首先將所有內容加載到內存中。 –

+1

對於Eric使用的1.8.7 Ruby,它可能是:) – Momer

2

退房的smarter_csv寶石,這對由塊讀取數據處理大文件的特殊選項。

它還將CSV數據作爲散列返回,這可以更容易地插入或更新數據庫中的數據。