因此,我尝试将一个相当大(大约 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 版本,但最好有更快的东西。
提前致谢。