Read.table和dbWriteTable导致不同的输出?

时间:2014-09-22 14:28:54

标签: r sqlite read.table

我正在处理12个大型数据文件,所有这些文件都悬停在3到5 GB之间,所以我转向使用RSQLite进行导入和初始选择。在这种情况下给出一个可重复的例子是很困难的,所以如果你能想出任何东西,那就太棒了。

如果我拿一小部分数据,读入,然后把它写到桌子上,我就得到了我想要的数据:

con <- dbConnect("SQLite", dbname = "R2")
f <- file("chr1.ld") 
open(f) 
data <- read.table(f, nrow=100, header=TRUE)
dbWriteTable(con, name = "Chr1test", value = data)

> dbListFields(con, "Chr1test")
[1] "row_names" "CHR_A"     "BP_A"      "SNP_A"     "CHR_B"     "BP_B"      "SNP_B"     "R2"     

> dbGetQuery(con, "SELECT * FROM Chr1test LIMIT 2")
  row_names CHR_A BP_A      SNP_A CHR_B BP_B       SNP_B         R2
1         1     1 1579 SNP-1.578.     1 2097 SNP-1.1096. 0.07223050
2         2     1 1579 SNP-1.578.     1 2553 SNP-1.1552. 0.00763724

如果我将所有数据直接读入表中,我的列就没有正确分开。我试过了sep =&#34; &#34;和sep =&#34; \ t&#34;,但两者都给出相同的列分隔

dbWriteTable(con, name = "Chr1", value ="chr1.ld", header = TRUE)
> dbListFields(con, "Chr1")
[1] "CHR_A_________BP_A______________SNP_A__CHR_B_________BP_B______________SNP_B___________R

我可以说这显然是某种消除问题,但我已经用尽了我的想法如何解决它。有没有人遇到过这个?

*编辑,更新: 似乎这很有效:

n <- 1000000
f <- file("chr1.ld")
open(f)
data <- read.table(f, nrow = n, header = TRUE)

con_data <- dbConnect("SQLite", dbname = "R2")
while (nrow(data) == n){
  dbWriteTable(con_data, data, name = "ch1", append = TRUE, header = TRUE)
  data <- read.table(f, nrow = n, header = TRUE)
}
close(f)
if (nrow(data) != 0){
  dbWriteTable(con_data, data, name = "ch1", append = TRUE)
}

虽然我无法弄清楚为什么只是通过SQLite编写表是一个问题。可能是一个记忆问题。

1 个答案:

答案 0 :(得分:1)

我猜你的大文件导致了一个空闲内存问题(请参阅read.table文档下的内存使用情况)。向我们展示chr1.ld的前几行是很有帮助的(在* nix系统上你只需要说“head -n 5 chr1.ld”来得到前五行)。 如果这是一个内存问题,那么你可能会尝试将文件作为解决方法而不是吞噬整个文件。 确定或估计chr1.ld中的行数(在* nix系统上,例如“wc -l chr1.ld”)。 假设您的文件有100,000行。

`sip.size = 100
for (i in seq(0,100000,sip.size)) {
    data <- read.table(f, nrow=sip.size, skip=i, header=TRUE)
    dbWriteTable(con, name = "SippyCup", value = data, append=TRUE)
}`

你可能会在最后看到警告,但数据应该通过。如果你有read.table试图考虑因素的字符数据,那么除非只有少数几个因素,所有这些因素都保证在每个组块中都会出现,否则这个组合将不会令人满意。您可能需要告诉read.table不要考虑这些列或使用其他方法查看所有可能的因素,以便您可以列出read.table。 (在* nix上,拆分一列并将其传输到uniq。)