R импорт данных в блоках - PullRequest
       10

R импорт данных в блоках

0 голосов
/ 23 апреля 2020

Я пытаюсь импортировать много данных в R. Настолько, что R выходит из строя через 15 минут после импорта.

Поэтому мне нужно разбить импорт данных на интервалы. Ниже описано, как я сделал это за один интервал из 101-200, вызывая список ALL200.

Однако я не уверен, как это автоматизировать, так как мне нужно каждый раз устанавливать интервал на следующие 100?

 ALL200 <- list() # creates a list
    listcsv <- dir(pattern = "*.csv") # creates the list of all the csv files in the directory
    #make a list in R with all the stocks
    for (k in 101:200){
      ALL200[[k]] <- read_csv(listcsv[k], 
                               col_types = cols(expirDate = col_date(format = "%Y-%m-%d"), 
                                                                    trade_date = col_date(format = "%Y-%m-%d")))

Надеюсь, вы мне поможете.

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Я бы дал data.table попытку:

library(data.table)
library(fasttime)
## generate mock files
set.seed(1)
bigdt <- data.table(expirDate = paste(sample(1980:2020, 1e6, replace = T), 
                                       sample(1:12, 1e6, replace = T),
                                       sample(1:28, 1e6, replace = T),
                                       sep = "-"),
                    trade_date = paste(sample(1980:2020, 1e6, replace = T), 
                                       sample(1:12, 1e6, replace = T),
                                       sample(1:28, 1e6, replace = T),
                                       sep = "-"))
biglist <- split(bigdt, ceiling(seq_len(dim(bigdt)[1])/1e3))
invisible(lapply(seq_along(biglist), 
    function(x) fwrite(biglist[[x]], 
        file=paste0("datefile_", sprintf("%04d", x), ".csv"))))

## read files in chunks of 100
system.time({ ## for timing
listcsv <- dir(pattern = "date.*csv")
listcsv <- split(listcsv, ceiling(seq_along(listcsv)/100))
importFiles <- function(x){
    dt <- setNames(lapply(listcsv[[x]], fread), listcsv[[x]])
    dt <- rbindlist(dt, idcol = "File")
    dt[, c("expirDate", "trade_date") := lapply(.SD, fastPOSIXct, "GMT"), .SDcols=c("expirDate", "trade_date")][]
    # maybe do additional filtering, removal of columns, etc.
}
bigdt <- rbindlist(lapply(seq_along(listcsv), importFiles))
})
#>    user  system elapsed 
#>   0.572   0.033   0.607
bigdt
#>                       File  expirDate trade_date
#>       1: datefile_0001.csv 1983-12-03 2002-07-25
#>       2: datefile_0001.csv 2018-03-24 1998-07-09
#>       3: datefile_0001.csv 1980-08-21 1985-11-05
#>       4: datefile_0001.csv 2013-10-20 2011-11-03
#>       5: datefile_0001.csv 2002-10-15 1996-05-25
#>      ---                                        
#>  999996: datefile_1000.csv 1998-03-05 1986-11-08
#>  999997: datefile_1000.csv 1984-01-13 2004-05-21
#>  999998: datefile_1000.csv 1991-12-20 1989-09-14
#>  999999: datefile_1000.csv 2005-03-24 2015-06-04
#> 1000000: datefile_1000.csv 2007-04-22 1996-07-06

Создано в 2020-04-23 пакетом Представить (v0.3.0)

0 голосов
/ 23 апреля 2020

Я не уверен, что это решит ваш вопрос, но попробуйте использовать список списков:

A <- list()

listcsv <- dir(pattern = "*.csv")

for (i in 1:10) {
    B <- list()
    for (k in ( (i*100 + 1):((i+1)*100)){
      B[[k]] <- read_csv(listcsv[k], 
                         col_types = cols(expirDate = col_date(format = "%Y-%m-%d"),
                         trade_date = col_date(format = "%Y-%m-%d")))
    }
    A[[i]] <- B
}
...