如何使用bigmemory包加载具有混合类型列的大csv文件

时间:2011-08-07 04:29:01

标签: r csv dataframe large-files import-from-csv

有没有办法结合使用bigmemory包中的scan()和read.big.matrix()来读取带有混合类型列的200 MB .csv文件,以便结果是带整数的数据帧,字符和数字列?

4 个答案:

答案 0 :(得分:9)

尝试使用ff包。

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

函数'read.table.ffdf'将分隔的平面文件读入'ffdf'      对象,非常像(和使用)'read.table'。它也可以       使用任何便利包装工具,如'read.csv'并提供       对于R来说,它自己的便利包装(例如'read.csv.ffdf')       包装

对于200Mb,这应该是一项简单的任务。

 x <- read.csv.ffdf(file=csvfile)

(对于更大的文件,可能需要您调查一些配置选项,具体取决于您的机器和操作系统。)

答案 1 :(得分:6)

啊,有些事情在这一生中是不可能的,并且有一些被误解并导致不愉快的情况。 @Roman是对的:矩阵必须是一种原子类型。这不是数据帧。

由于矩阵必须是一种类型,尝试使用斯诺克bigmemory来处理多种类型本身就是一件坏事。可以吗?我不会去那儿。为什么?因为其他一切都会假设它是一个矩阵,而不是数据帧。这将导致更多的问题和更多的悲伤。

现在,您可以做的是识别每个列的类型,并生成一组不同的bigmemory文件,每个文件包含特定类型的项目。例如。 charBM =字符大矩阵,intBM =整数大矩阵,依此类推。然后,您可以开发一个包装器,从而生成所有这些数据帧。我仍然不建议:将不同的项目视为它们是什么,或者如果可以的话,强迫同质性,而不是试图产生一个大的数据帧格里芬。

@mdsumner建议ff是正确的。另一个存储选项是HDF5,您可以通过R中的ncdf4访问它。不幸的是,这些其他包不如bigmemory那么令人愉快。

答案 2 :(得分:3)

根据帮助文件,没有。

  

文件必须只包含一种原子类型(例如,所有整数)。   您(用户)应该知道您的文件是否包含行和/或列   名称和各种选项组合应该有所帮助   获得理想的行为。

我不熟悉这个包/函数,但在R中,矩阵只能有一种原子类型(与data.frames不同)。

答案 3 :(得分:0)

最好的解决方案是逐行读取文件并解析它,这样读取过程将占用几乎线性的内存量。