使用 read.csv() 导入时 R 中止

Posted

技术标签:

【中文标题】使用 read.csv() 导入时 R 中止【英文标题】:R aborts while importing with read.csv() 【发布时间】:2015-09-08 13:58:46 【问题描述】:

我有一个大约 240 mio 行和 3 列的矩阵,我需要在 R 中“导入和使用”。我现在无法访问服务器,所以我有了导入子矩阵的想法,使用它,然后将其从环境中丢弃并重复该过程,直到整个矩阵完成(对于我必须做的事情,它也同样有效)。 特别是,由于行数是 11 的倍数,我决定使用 11 个子矩阵。因此,我一直在做的事情如下:

    定义Nstep为每次导入的行数(总nr of rows/11,约22 Mio。) mat.n 做我该做的事 丢弃矩阵 对 n = 1, 2, ..., 11 重复(手动,以确保每一步都成功)上述操作。

在完成第 6 个块的导入后,我意识到我离开了 header=T,所以我设置了 header=F。从那时起,每次我尝试导入文件时,R 会话都会中止。 *编辑:重新设置 header=T 也不起作用。

我认为这取决于 header=F 的东西,但事实并非如此。因此我猜它与 Nstep 或子矩阵的第一行有关。我试着做一些实验: - 如果我重新导入第一个块,它可以工作 - 如果我导入第 5 个块,仅前 10 行,则需要很长时间(我让它在大约 20 分钟前开始并且尚未完成,即使它只有 10 行) - 如果我在 R 上重复它而不是在 R Studio 上重复,我会遇到同样的问题。

知道为什么会这样吗? 我正在使用 R Studio 版本 0.98.1028 上的 R 版本 3.1.1,平台:x86_64-w64-mingw32/x64(64 位)。

【问题讨论】:

【参考方案1】:

对于大数据文件,有更好的 read.* 函数替代方案。特别是 data.table 包的 fread() 函数或 readr 包,它具有比 fread 更安全的替代方案(虽然比 fread 慢一点,但与原始 read.* 函数相比仍然非常快)。

最终,您仍然会受到计算机内存大小的限制。也有解决方法,但我认为对于您的情况 fread() 或 readr 会做得很好。

【讨论】:

感谢@Bhaskar,它成功了!只是我仍然想知道为什么它在以前工作但缓慢但很好的动作之后突然开始中止。也许是我无法检测到的内存过载? @jeiroje ,你能详细说明“它有效”吗?使用您的旧方法是否有效?或者它是否使用 data.table 或 readr 工作,如果是这样,究竟是哪一个? 是的,我遵循了管道,但将 read.csv2() 替换为 fread()【参考方案2】:

为了不耗尽内存,您可以尝试在rm(mat.n) 处理矩阵后删除矩阵,然后确保使用gc() 释放内存。

【讨论】:

当然,这也在筹备中,我只是忘了提 ;-)

以上是关于使用 read.csv() 导入时 R 中止的主要内容,如果未能解决你的问题,请参考以下文章

R语言data.table导入数据实战:fread函数和read.csv函数时间效率对比

R数据导入导出: read.table()和read.csv()的区别

将 .csv 导入 R 时出现 UTF-8 编码错误?

R语言:各类型数据文件的导入

从 R 中的大型 .CSV 导入和提取随机样本

从R中的大型.CSV导入和提取随机样本