2011-08-07 34 views
6

有沒有一種方法可以將bigmemory軟件包中scan()和read.big.matrix()的使用組合起來,以讀取200 MB .csv使用混合類型列的文件,以便結果是包含整數,字符和數字列的數據框?如何使用bigmemory軟件包加載混合類型的大型csv文件

+1

是否必須是bigmemory軟件包?我發現ff對這類東西更有用 – mdsumner

+0

@mdsumner在正確的軌道上。它甚至需要文件支持嗎?對於200MB,我只是閱讀它,使用它,然後將它保存爲一個或多個BM文件(或者如果您願意,可以用'ff'來保存)。 – Iterator

回答

3

根據幫助文件,沒有。

文件只能包含一個原子類型(例如全部整數)。 您,用戶應該知道您的文件是否有行名稱和/或列名爲 ,並且各種選項組合應該有助於 獲取所需的行爲。

我不熟悉這個包/函數,但是在R中,矩陣只能有一個原子類型(不像data.frames)。

+0

謝謝你的兩分錢。在這個博客上,http://joshpaulson.wordpress.com/2010/12/20/michael-kane-on-bigmemory/有人提出了一種解決方法來限制只有一種原子類型的矩陣(這是一個被大的特性所繼承的特性。矩陣)就是使用scan()。我希望有人能夠從bigmemory包中分享他們的經驗,特別是閱讀混合類型的列以及他們是否使用過scan()。 – Lourdes

+0

也許你可以在處理階段做到這一點,但我想證明是錯誤的(sensu @Iterator)。 –

9

爲此嘗試使用ff包。

library(ff) 
help(read.table.ffdf) 

函數「read.table.ffdf」讀取分離平面文件到「ffdf」 目的,非常像(和使用)「函數read.table」。它也可以用 與任何便利包裝(如read.csv)一起使用,併爲R的常用包裝 提供其自己的便利包裝(例如,'read.csv.ffdf') 。

對於200Mb,它應該是這樣簡單的任務。 (對於大得多的文件,可能需要調查一些配置選項,具體取決於您的機器和操作系統)。

+0

謝謝你mdsummer。我嘗試了ff軟件包,能夠讀取存儲在一個對象中的近300 MB數據集,然後我使用as.data.frame強制轉換爲數據框。然而,這讓人記憶猶新,幾乎沒有什麼可供分析的。這雖然是一個好的開始,也是一個有用的建議。 – Lourdes

+0

整個過程不是全部加載它,而是使用ff軟件包的內存映射功能。有工具可以從ff數據結構中提取部分 – mdsumner

6

啊,這輩子有些事情是不可能的,有一些是被誤解的,會導致不愉快的情況。 @羅曼是正確的:一個矩陣必須是一個原子類型。這不是一個數據框。

由於矩陣必須是一種類型,因此嘗試斯諾克bigmemory來處理多種類型本身就是一件壞事。它可以完成嗎?我不會去那裏。爲什麼?因爲一切都會假設它正在獲得一個矩陣,而不是一個數據幀。這會導致更多的問題和更多的悲傷。

現在,您可以做的是確定每個列的類型,並生成一組不同的bigmemory文件,每個文件都包含特定類型的項目。例如。 charBM =字符大矩陣,intBM =整數大矩陣,依此類推。然後,您可能會開發出一個包裝器,它可以生成所有這些數據框架。儘管如此,我仍然不建議:將不同的項目視爲自己的項目,或者儘可能強制同質化,而不是嘗試製作大型數據框格里芬。

@mdsumner正確提示ff。另一種存儲選項是HDF5,您可以通過R.中的ncdf4訪問它。不幸的是,這些其他軟件包不如bigmemory那麼愉快。

+0

感謝迭代器。你是對的,其他軟件包不如大內存那麼愉快。 – Lourdes

0

最好的解決方案是逐行讀取文件並解析它,這樣讀取過程將佔用大量線性的內存。

+0

歡迎來到StackOverflow!但是,這並沒有回答這個問題,它特別針對大內存軟件包 –