我有一个.csv112GB 的文件,但既无法vroom打开也data.table::fread无法打开。即使我要求读取 10 行或仅几列,它也会抱怨映射错误:无法分配内存。
df<-data.table::fread("FINAL_data_Bus.csv", select = c(1:2),nrows=10)
System errno 22 unmapping file: Invalid argument
Error in data.table::fread("FINAL_data_Bus.csv", select = c(1:2), nrows = 10) :
Opened 112.3GB (120565605488 bytes) file ok but could not memory map it. This is a 64bit process. There is probably not enough contiguous virtual memory available.
Run Code Online (Sandbox Code Playgroud)
read.csv另一方面会愉快地读十行。
为什么不vroom使用fread通常的 altrep 来读取它,即使是 10 行?
我有一个 csv.gz 文件(据我所知)压缩前的大小为 70GB。我的机器有 50GB 的 RAM,所以无论如何我永远无法在 R 中打开它。
例如,我可以按如下方式加载前 10m 行:
library(vroom)
df <- vroom("HUGE.csv.gz", delim= ",", n_max = 10^7)
Run Code Online (Sandbox Code Playgroud)
对于我必须做的事情,可以一次加载 10m 行,执行我的操作,然后继续接下来的 10m 行。我可以循环执行此操作。
因此,我正在尝试skip论证。
df <- vroom("HUGE.csv.gz", delim= ",", n_max = 10^7, skip = 10^7)
Run Code Online (Sandbox Code Playgroud)
这会导致错误:
Error: The size of the connection buffer (131072) was not large enough
to fit a complete line:
* Increase it by setting `Sys.setenv("VROOM_CONNECTION_SIZE")`
Run Code Online (Sandbox Code Playgroud)
我增加了这个Sys.setenv("VROOM_CONNECTION_SIZE" = 131072*1000),但是,错误仍然存在。
这个问题有方法解决吗?
编辑:我发现随机访问 gzip 压缩的 csv (csv.gz) 是不可能的。我们必须从头开始。可能最简单的方法是解压并保存,然后跳过就可以了。
我有一个简单的操作,我读取几个 csv,绑定它们,然后导出,但vroom执行速度比其他方法慢得多。我肯定做错了什么,但我不确定是什么,或者为什么。
library(readr)
library(vroom)
library(data.table)
library(microbenchmark)
write_csv(mtcars, "test.csv")
microbenchmark(
readr={
t <- read_csv("test.csv", col_types=cols())
write_csv(t, "test.csv")
},data.tabl={
t <- fread("test.csv")
fwrite(t, "test.csv", sep=",")
},vroom={
t <- vroom("test.csv", delim=",", show_col_types = F)
vroom_write(t, "test.csv", delim=",")
},
times=10
)
#> Unit: milliseconds
#> expr min lq mean median uq max neval
#> readr 12.636961 12.662955 15.865400 12.928211 13.503029 41.104583 10
#> data.tabl 2.200815 2.275252 2.633456 2.342797 2.529283 4.830134 10
#> vroom 57.376353 57.915135 64.280365 58.496847 58.966311 117.150837 10
Run Code Online (Sandbox Code Playgroud)