R bigmemory 不会读取大的 csv 文件

Posted

技术标签:

【中文标题】R bigmemory 不会读取大的 csv 文件【英文标题】:R bigmemory won't read large csv file 【发布时间】:2016-05-29 13:53:01 【问题描述】:

我正在尝试使用 R biganalytics 包中的 read.big.matrix 以类似于 Vignette for bigmemory 的方式加载 689.4 MB 的 csv。

小插曲代码:

library(bigmemory)
library(biganalytics)
x <- read.big.matrix("airline.csv", type="integer", header=TRUE,
        backingfile="airline.bin",
        descriptorfile="airline.desc",
        extraCols="Age")

根据 42- 的评论,我在命令行 cut -d, -f9,11,17,18,23 --complement 2008.csv &gt; 2008cut.csv 上使用 cut 删除了因子变量

然后,我使用 sed sed -i 's/NA/0/g' 2008cut.csv 删除了在数据中发现的任何 NA 值,即使使用这些预处理步骤,我也会收到相同的错误。

我的代码:

#This works
x <- read.csv("~/Downloads/2008cut.csv",header=T)
dim(y)
#[1] 7009728      29
length(complete.cases(x))
#[1] 7009728

library(bigmemory)
library(biganalytics)
#This errors out
data <- read.big.matrix("~/Downloads/2008cut.csv", 
            type="integer", header=TRUE)

我在尝试运行 read.big.matrix 时收到以下错误:

Warning: stack imbalance in '.Call', 31 then 32
Warning: stack imbalance in '', 28 then 29
Warning: stack imbalance in '-', 23 then 24
Warning: stack imbalance in '-', 22 then 23
Warning: stack imbalance in '<-', 20 then 21
Error in big.matrix(nrow = numRows, ncol = createCols, type = type,
 dimnames = list(rowNames,  : 
    A big.matrix must have at least one row and one column

我发现其他人有这个问题,但他们有 mixed data 或 similar problem 但没有回应。在我搜索的某个时间点,邮件列表中的某个人询问用户是否可以运行x &lt;- big.matrix(nrow=1000,ncol=10) 之类的东西来确保 bigmemory 正常工作。我能够运行该代码并生成一个 big.matrix。

任何指导将不胜感激!

软件详情:

数据:2008 File R:3.2.3 操作系统:x86_64-pc-linux-gnu 大内存:4.5.19 biganalytics:1.1.14

【问题讨论】:

你的问题是内存限制的问题还是你只是想提高读取.csv文件的速度? 链接页面上文件结构的文档表明,为该文件选择“整数”不会成功。有些列显然不是整数。 @RafaelPereira 我试图更好地理解 bigmemory 库及其应用程序。我正在使用 32 GB 的 RAM,因此文件适合内存,但我想在 bigmemory 框架下探索数据。 @42- 好点。我最初用亚马逊文件尝试过这个。即使使用cut -d, -f9,11,17,18,23 --complement 2008.csv &gt; 2008cut.csv 删除因子变量后,我也收到相同的错误:-\ read.big.matrix 位于 bigmemory 而不是 biganalytics。不幸的是,我无法重现这一点,它在我的 linux (Ubuntu 14.04) 机器上没有问题。也许您可以向其他开发人员提交issue,他们可能会有想法。 【参考方案1】:

对于读取大文件,我建议使用 R data.table 包中的 fread

【讨论】:

这并没有解决问题,是吗? 看起来生成的表适用于 biglm 等工具,但不适用于 bigkmeans。 fread 似乎将整个文件加载到内存中,而 bigmemory 将指针存储在内存中。【参考方案2】:

使用绝对路径:

absolutePath <- normalizePath("~/Downloads/2008cut.csv")

x <- read.big.matrix(absolutePath, type="integer", header=TRUE,
        backingfile="airline.bin",
        descriptorfile="airline.desc",
        extraCols="Age")

【讨论】:

以上是关于R bigmemory 不会读取大的 csv 文件的主要内容,如果未能解决你的问题,请参考以下文章

R 中的 fread 将一个大的 .csv 文件导入为一行的数据框

使用 Python 或 R 将非常大的 sql 文件导出到 csv

如何有效且快速地将大型 (6 Gb) .csv 文件导入 R,而不会导致 R REPL 崩溃?

测试缓冲区是不是已在 R 中刷新

读取csv的文件信息

R中的流处理大型csv文件