【发布时间】:2018-03-28 08:34:49
【问题描述】:
我的数据源是 2GB 文件,由 3 列组成:key1、key2、result。 这些文件由超过 1000 万行组成。 我正在尝试在 Windows 系统上尽可能快地从 R 访问第 j 个文件的第 i 行。 Fread-ing 文件不是一个选项,因为它需要超过 2 分钟,这在这个用例中是不可能的。
我已经尝试了几种方法,但到目前为止都失败了:
方法 1: readlines、read.table 或 fread
readlines(file("myFile.csv", "r"),n=1, skip = M)
read.table("myFile.csv", skip=M, nrows=1)
fread("myFile.csv", skip=M, nrows=1)
这些方法的问题在于,当 M 趋于文件末尾时,访问时间很长。如果能找到类似的解决方案,我会非常感兴趣
方法2: fst包
正如评论/答案部分所建议的,由于From / To 参数,fst 包工作正常,但它需要在 FST 格式下复制 CSV,这在阅读时很难维护数千个 CSV 文件。 “基于csv”的解决方案会更好。
方法 3: SQLite DB
library(RSQLite)
library(data.table)
db <- dbConnect(SQLite(), "NEW_DB")
dbWriteTable(db, "chocs", fread("myFile.csv"), append = TRUE, row.names = FALSE)
dbGetQuery(db, "SELECT * FROM chocs WHERE V1 = 1 AND V2 = 1")
这种方法的问题是它创建 SQL DB 而 CSV 已经存在,并且查询不如方法 2 中提出的 FST 库那么快
有什么快速的方法吗?
【问题讨论】:
-
read.table() 来自基础 R。fread() 来自 data.table。
-
使用方法 3,在数据加载后类似于
dbGetQuery(db, "CREATE INDEX i1 ON chocs (V2, V1)")并且在批量加载之前不创建主键索引(如 Panagiotis 所述) -
主键是一个索引,对于插入的每一行都必须更新。批量加载数据时的一个常见技巧是禁用或删除索引,加载数据然后重建它们。
-
@NielsouAkbrg SQLite 可以直接使用
.import命令as shown here 导入CSV 文件。之后可以添加索引/主键
标签: r performance bigdata