Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将大型zip tsv文件导入到R时出现内存问题_R_Csv_Memory - Fatal编程技术网

将大型zip tsv文件导入到R时出现内存问题

将大型zip tsv文件导入到R时出现内存问题,r,csv,memory,R,Csv,Memory,我正在尝试下载此文件,但无法在任何应用程序中打开它。我试图对它进行一些分析,但系统告诉我内存不足。我尝试增加最大限制,但它仍然表示内存不足。任何援助都将是巨大的 library(readr) file_url <- "http://samhda.s3-us-gov-west-1.amazonaws.com/s3fs-public/field-uploads-protected/studies/NSDUH-2002-2018/NSDUH-2002-2018-datasets/NSD

我正在尝试下载此文件,但无法在任何应用程序中打开它。我试图对它进行一些分析,但系统告诉我内存不足。我尝试增加最大限制,但它仍然表示内存不足。任何援助都将是巨大的

library(readr)
file_url <- "http://samhda.s3-us-gov-west-1.amazonaws.com/s3fs-public/field-uploads-protected/studies/NSDUH-2002-2018/NSDUH-2002-2018-datasets/NSDUH-2002-2018-DS0001/NSDUH-2002-2018-DS0001-bundles-with-study-info/NSDUH-2002-2018-DS0001-bndl-data-tsv.zip"
zip <- tempfile(fileext = ".zip")
tsv_file <- download.file(file_url, zip, mode = "wb")
unzip_f <- unzip(tsv_file)
rawdata <- read_tsv(unzip_f, col_names= FALSE)
view(rawdata)
unlink(temp)
我收到的错误信息:

Error: cannot allocate vector of size 7.8 Mb

readr::read\u tsv()
中的
skip=
n\u max=
参数可用于控制从选项卡分隔的文件读取到数据框中的数据量

要阅读前10个观察结果以便查看列名,可以运行:

library(readr)
file_url <- "http://samhda.s3-us-gov-west-1.amazonaws.com/s3fs-public/field-uploads-protected/studies/NSDUH-2002-2018/NSDUH-2002-2018-datasets/NSDUH-2002-2018-DS0001/NSDUH-2002-2018-DS0001-bundles-with-study-info/NSDUH-2002-2018-DS0001-bndl-data-tsv.zip"
zip <- tempfile(fileext = ".zip")
tsv_file <- download.file(file_url, zip, mode = "wb")
unzip_f <- unzip(zip,exdir="./data")
df <- read_tsv(unzip_f, col_names= TRUE, n_max = 10)
现在,我们将验证100000行数据所消耗的RAM量,并计算100000次观测的加载时间

system.time(df_100000 <- read_tsv("./data/NSDUH_2002_2018_tab.tsv", 
                      col_names = TRUE, n_max = 100000))
format(object.size(df_100000),units = "auto")


   user  system elapsed 
 55.276   4.136  60.559

> format(object.size(df_100000),units = "auto")
[1] "2.7 Gb"
theTypes <- c("n",rep("_",3661))
system.time(df_obs <- read_tsv("./data/NSDUH_2002_2018_tab.tsv",col_types = theTypes, 
                                  col_names = TRUE))
nrow(df_obs)
format(object.size(df_obs),units = "auto")

   user  system elapsed 
175.208  27.694 210.948 
> nrow(df_obs)
[1] 949285
> format(object.size(df_obs),units = "auto")
[1] "39.8 Mb"
使用2.5Ghz的Intel i7-4870HQ处理器,从MacBook Pro 15上的原始数据文件中读取一列数据的所有观测值几乎需要4分钟

nrow()
的结果告诉我们原始数据文件中有949285行。如果我们将文件分成200000个观察数据块,我们可以读取它们,并使用
saveRDS()
将它们保存为RDS文件,以供后续处理

以迭代方式读取文件并以RDS的形式写入 当我们在environment viewer中查看数据帧时,可以看到它包含200000个观察值

system.time(df_100000 <- read_tsv("./data/NSDUH_2002_2018_tab.tsv", 
                      col_names = TRUE, n_max = 100000))
format(object.size(df_100000),units = "auto")


   user  system elapsed 
 55.276   4.136  60.559

> format(object.size(df_100000),units = "auto")
[1] "2.7 Gb"
theTypes <- c("n",rep("_",3661))
system.time(df_obs <- read_tsv("./data/NSDUH_2002_2018_tab.tsv",col_types = theTypes, 
                                  col_names = TRUE))
nrow(df_obs)
format(object.size(df_obs),units = "auto")

   user  system elapsed 
175.208  27.694 210.948 
> nrow(df_obs)
[1] 949285
> format(object.size(df_obs),units = "auto")
[1] "39.8 Mb"

文件有多大?刚看了一下:631MoDid您是否也尝试过使用readLines逐行读取文件,而不是一步读取?大小=12.3 GB,压缩为645989kb我没有使用readLines,是否可以在使用该功能后将其分段读取并合并?谢谢,这给了我一些很好的背景知识,告诉我将来如何处理类似的问题。我真的很感激。@Tesla_Republic-不客气。如果您觉得答案有帮助,请接受并投票。这在很大程度上确实有帮助,但我仍然无法处理信息并创建5个单独的文件。我至少可以得到一个有20万行的文件。我目前正试图找出如何获取最后的200k行,而不是前200k行。老实说,我不确定问题是什么,如果我运行最后一位代码(编写RDS),它会说“错误:无法分配大小为30kb的向量”,然后如果我在控制台中键入任何内容,它会给出相同的错误,甚至不会自动填充或处理任何内容。我必须重新启动RStudio。我也试着释放内存空间,但这确实帮了我很大的忙,而且我认为我不需要整个数据集。我想投票,但我是个新手,还不能。@Tesla_Republic-我更新了我的答案,提供了一个只读取最后200000行的解决方案。另外,需要注意的是,在具有8Gb RAM的机器上,一次只能有一个200000行的数据帧和内存中的所有列。您需要RAM的其余部分在文件上运行其他R函数。
for(i in 1:5){
     df <- read_tsv("./data/NSDUH_2002_2018_tab.tsv",
                                         skip = (i - 1) * 200000,
                                         n_max = 200000,
                                         col_names = c_names)
     saveRDS(df,paste0("./data/usnuh_",i,".RDS"))
} 
# read last 200K rows. first read one row to obtain column names
library(readr) 
df <- read_tsv("./data/NSDUH_2002_2018_tab.tsv", 
               col_names = TRUE, n_max = 1)
c_names <- colnames(df)
# next, configure skip = relative to end of file and read 
df <- read_tsv("./data/NSDUH_2002_2018_tab.tsv",
               skip = (949258 - 200000),
               n_max = 200000,
               col_names = c_names)