【问题标题】:UNIX Importing LARGE csv into SQLiteUNIX 将 LARGE csv 导入 SQLite
【发布时间】:2011-05-20 00:07:56
【问题描述】:

我有一个 5gig 的 csv 文件(也可以作为 sas 数据文件,如果它更容易的话),我需要将它放入一个 sql 数据库中,以便在 R 中使用它。

变量名称都包含在第一个观察行中,并用双引号引起来。有 1000 多个变量,有些是数字,有些是字符(虽然有些字符变量是数字字符串,但我不太担心我可以在 R 中修复它)。

我的问题是如何以最小的痛苦将 csv 文件导入数据库中的新表?

我发现要先创建表(包括指定所有变量,其中我有 1000 多个),然后使用“.import 文件表”来引入数据。 或者,使用一些 gui 导入向导,这对我来说不是一个选项。

对不起,如果这是 sql 101,但感谢您的帮助。

【问题讨论】:

  • 您需要使用多少 RAM?
  • 我们刚刚切换到一个新的研究集群,所以我必须与管理员核实具体细节,但我相信使用默认作业提交选项可以获得 16 GB,当然我可以请求更多根据需要。
  • 请务必检查将所有内容保留在内存中的选项。不时从您的程序中保存工作区。 16GB 绰绰有余。可能会更快更容易,如果需要,您甚至可以选择向操作员请求更多 RAM。 (你正在运行 LINUX,对吧?)
  • 我认为我的理解不正确。我可以将数据导入工作区,确定并根据需要保存并重新加载,但我不能在会话之间将程序加载到内存中。我将使用这个数据集一段时间,加载工作区将花费比我等待工作区加载更多的时间。是的,我们现在使用的是 red hat,以前是 solaris。

标签: sqlite r csv sas


【解决方案1】:

查看sqldf包中的“read.csv.sql”函数。

这会将 csv 文件转换为 SQLite 数据库,然后将其读入 R,您应该能够保留中间数据库以供您使用。

【讨论】:

【解决方案2】:

这是我的工作流程:

library("RSQLite")
setwd("~/your/dir")
db <- dbConnect(SQLite(), dbname="your_db.sqlite") ## will make, if not present
field.types <- list(
        date="INTEGER",
        symbol="TEXT",
        permno="INTEGER",
        shrcd="INTEGER",
        prc="REAL",
        ret="REAL")
dbWriteTable(conn=db, name="your_table", value="your_file.csv", row.names=FALSE, header=TRUE, field.types=field.types)
dbGetQuery(db, "CREATE INDEX IF NOT EXISTS idx_your_table_date_sym ON crsp (date, symbol)")
dbDisconnect(db)

field.types 不是必需的。如果您不提供此列表,RSQLite 将从标题中猜测。索引也不是必需的,但稍后会加快您的查询速度(如果您为查询建立正确的列)。

我已经在 SO 上学习了很多这些东西,所以如果你查看我在 SQLite 上提出/回答的问题,你可能会发现一些标记性的东西。

【讨论】:

  • +1。请注意,如果您的逗号分隔文件具有不同的扩展名(有时...),dbWriteTable 将失败。只需重命名为.csv
猜你喜欢
  • 2013-02-03
  • 2015-09-23
  • 2012-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-28
  • 2011-04-16
  • 2017-03-25
相关资源
最近更新 更多