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

R aborts while importing with read.csv()

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

  1. 定义Nstep为每次导入的行数(总nr为rows/11,约为22 Mio。)
  2. mat.n <- read.csv2(filepath, nrows=Nstep, skip =(n-1)*Nstep-1, header=T)
  3. 做我该做的事
  4. 丢弃矩阵
  5. 针对 n = 1、2、...、11 重复(手动,以确保每一步都成功)上述操作。

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

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

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

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

在一天结束时,您仍然会受到计算机内存大小的限制。也有解决方法,但我认为对于您的情况 fread() 或 readr 就可以了。

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