2011-08-07 32 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!但是,这并没有回答这个问题,它特别针对大内存软件包 –