R 在使用 read.csv() 导入时中止
R aborts while importing with read.csv()
我有一个约 240 mio 行和 3 列的矩阵,我需要在 R 中 "import and work with"。我现在无法访问服务器,所以我想到了导入子矩阵,使用它,然后从环境中丢弃它并重复该过程,直到完成整个矩阵(对于我必须做的事情,它同样有效)。
特别是,由于行数是 11 的倍数,我决定使用 11 个子矩阵。因此,我一直在做的是:
- 定义Nstep为每次导入的行数(总nr为rows/11,约为22 Mio。)
- mat.n <- read.csv2(filepath, nrows=Nstep, skip =(n-1)*Nstep-1, header=T)
- 做我该做的事
- 丢弃矩阵
- 针对 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()
释放内存。
我有一个约 240 mio 行和 3 列的矩阵,我需要在 R 中 "import and work with"。我现在无法访问服务器,所以我想到了导入子矩阵,使用它,然后从环境中丢弃它并重复该过程,直到完成整个矩阵(对于我必须做的事情,它同样有效)。 特别是,由于行数是 11 的倍数,我决定使用 11 个子矩阵。因此,我一直在做的是:
- 定义Nstep为每次导入的行数(总nr为rows/11,约为22 Mio。)
- mat.n <- read.csv2(filepath, nrows=Nstep, skip =(n-1)*Nstep-1, header=T)
- 做我该做的事
- 丢弃矩阵
- 针对 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()
释放内存。