0

因此,我尝试将一个相当大(大约 100 GB 和 6 亿行)的 csv 文件导入我设置的 sqlite 数据库中,方法是一次读取大约一百万行的 csv 并编写一个函数为以下:

import_csv_sql_vroom <- function(csvname, n.row = 100000, tablename, sqlname) {
  check <- 1
  header <- colnames(vroom(csvname,
                              n_max = 1,
                              skip = 0,
                              col_names = TRUE,
                           delim = ","))
  repeat {
    tmp <- vroom(csvname,
                    n_max = n.row,
                    skip = check,
                 col_names = FALSE,
                 delim = ",")
    colnames(tmp) <- header
    dbWriteTable(sqlname, 
                 tablename, 
                 tmp,
                 append = TRUE)
    check <- check + nrow(tmp)
    if (nrow(tmp) < n.row) {
      print("File sucessfully imported");
      break
    }
  }
}

现在发生的是我收到以下错误:

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")`

使用 read.csv 的类似函数,虽然非常慢,但工作得非常好,这就是为什么我尝试使用 vroom 而不是它:

import_csv_sql <- function(csvname, n.row = 100000, tablename, sqlname) {
  check <- 1
  header <- colnames(read.csv(csvname,
                  nrow = 1,
                  skip = 0,
                  header = TRUE))
  repeat {
    tmp <- read.csv(csvname,
                    nrow = n.row,
                    skip = check,
                    header = FALSE)
    colnames(tmp) <- header
    dbWriteTable(sqlname, 
                 tablename, 
                 tmp,
                 append = TRUE)
    check <- check + nrow(tmp)
    if (nrow(tmp) < n.row) {
      print("File sucessfully imported");
      break
    }
  }
}

现在我可以通过以下方式增加连接大小:

Sys.setenv(VROOM_CONNECTION_SIZE= "insert whatever size")

虽然这允许循环的多次迭代运行,但它仍然会遇到连接大小错误。增加连接大小会进一步导致:

Error: std::bad_alloc

有人对这个问题的解决方法有一个不错的想法吗?我当然可以继续使用 read.csv 版本,但最好有更快的东西。

提前致谢。

4

0 回答 0