2011-03-08 128 views
45

的實際限制,我一直在閱讀的是如何不函數read.table高效地爲大型數據文件。另外R如何不適合大數據集。所以我想知道我在哪裏可以找到實際的限制,以及(1)讀取各種大小數據的性能圖表(2)處理不同大小的數據。R數據幀

實際上,我想知道什麼時候性能會降低,當我打了一個路障。此外,任何與C++/MATLAB或其他語言的比較都會非常有用。最後如果Rcpp和RInside有任何特別的性能比較,那會很棒!

+1

的[高性能任務視圖(HTTP://cran.r-project .org/web/views/HighPerformanceComputing.html)幾乎肯定會回答這些問題中的一部分。 – Chase 2011-03-08 14:32:23

+0

Rcpp是封裝了R C API的C++庫,而RInside提供了從C++代碼調用R的功能。也就是說,他們都受到R的約束。 – 2011-03-08 14:54:24

+0

http://stackoverflow.com/questions/1727772/quickly-reading-very-large-tables-as-dataframes-in-r – 2015-10-13 14:22:07

回答

46

R 適合大型數據集,但您可能不得不改變自己的教學方法。我在Big Data for R上發佈了一篇文章,其中討論了一個30 GB的數據集,您可能會發現它對靈感有幫助。

通常的信息來源是High-Performance Computing Task View和R-SIG HPC郵件列表R-SIG HPC

你必須解決的主要限制是在載體上的長度爲2^31-1元件,其也不會這麼糟糕如果R不矩陣存儲爲矢量的歷史極限。 (極限是與一些BLAS庫的兼容性。)

我們定期分析電信呼叫數據記錄和營銷數據庫多萬客戶使用R,所以會很樂意談論更多,如果你有興趣。

+0

你有任何統計數據有多少嘎吱嘎吱地使用R,比說C++類語言慢多少? Thnx - Egon – Egon 2011-03-08 16:14:59

+7

@Egon:我的背景是這樣的,我的任何數據分析問題的本能就是激發一個文本編輯器和一個Fortran編譯器。但是現在我發現分析中的限制因素更多的是我找出正確的方法並將其轉化爲代碼。爲此,R對我來說更加高效。當然,在使用R時我必須仔細考慮性能,但實際上你必須使用編譯代碼。我確實有一些我們已編譯的元素,但它們相對較少,幾乎都是先在R中進行設計和測試。這就是爲什麼R更快。 – 2011-03-08 19:16:35

8

我只能回答一個有關read.table,因爲我沒有處理大型數據集的經驗。如果您不提供colClasses參數,則read.table表現不佳。沒有它,read.table默認爲NA,並試圖猜測每一列的一個類,並且可能會很慢,特別是當您有很多列時。

26

的物理限制從載體使用的32位索引產生。結果,允許向量高達2^31 - 1。矩陣是與尺寸矢量,所以nrow(mat)ncol(mat)產品必須在2^31 - 1.數據幀和列表是通用的載體,因此,每個部件可採取2^31 - 1個條目,該數據幀的裝置,則可以有多行列。對於列表,您可以有2^31 - 1個組件,每個2^31 - 1個元素。這是從Duncan Murdoch最近的一個posting得出的回覆Q上的R幫助

現在所有的都必須適合內存與標準R,以便可能是一個更緊迫的限制,但High-Performance Computing任務視圖,其他人已經提到包含可以規避內存問題的軟件包的詳細信息。

+0

請注意,2^31 - 1元素的限制僅適用於R 2.x.y.在R 3.x.y中,限制更高(請參閱https://cran.r-project.org/doc/manuals/R-ints.html#Long-vectors)。 – esel 2018-03-08 14:27:32

13

1)將R導入/導出手冊應該是通話的第一口有關導入數據的問題 - 有很多選擇,什麼會爲你的可能是非常具體的工作。

http://cran.r-project.org/doc/manuals/R-data.html

read.table具體大大改善性能,如果提供給它的選擇的使用,特別colClassescomment.char,和nrows - 這是因爲此信息必須被從數據本身,它可以是昂貴的推斷。

2)是用於任何向量,矩陣,陣列,在一個data.frame,或列表列的長度(元件的總數)的特定限制。這是由於在引擎下使用了32位索引,對於32位和64位R是真的。數字是2^31 - 1。這是data.frame的最大行數,但是它是如此之大,你甚至有可能在你開始收集它們中的幾個之前甚至單個向量的內存不足。

有關詳細信息,請參閱help(Memory-limits)help(Memory)

這個長度的單個向量將佔用很多GB的內存(取決於每個向量的類型和存儲模式 - 數字爲17.1),所以除非您真的在推動事情,否則它不可能是一個合適的限制。如果您確實需要將事情推到可用的系統內存(64位是強制性的),那麼在導入/導出手冊或內存映射文件選項(如ff軟件包)中討論的標準數據庫技術值得考慮。 CRAN任務視圖高性能計算是實現這一目標的良好資源。

最後,如果你的內存堆棧(16GB或更多),需要64位索引它可能出現在未來的R.釋放http://www.mail-archive.com/[email protected]/msg92035.html

此外,羅斯·哈卡討論了一些歷史的決策和未來在論文方向爲就像語言中的R和了會談: http://www.stat.auckland.ac.nz/~ihaka/?Papers_and_Talks

7

當讀取大的CSV文件x GB <=> y.1e6 rows我覺得data.table::fread(爲1.8.7版)是你能得到它做最快的替代install.packages("data.table", repos="http://R-Forge.R-project.org")

您通常會獲得5到10的因子(並且所有sep,row.names等均由函數本身處理)。如果您有許多文件和足夠體面的計算機(多個內核),我建議使用parallel軟件包(作爲R.2.14的一部分)爲每個內核加載一個文件。

我最後一次read.csv和多線程的4個核心使用fread我5分鐘就到20秒這樣做單線程負載之間