2015-09-05 92 views
1

我有一个数据库与各种令牌和频率计数。当我尝试使用RSQLite从R中检索这些数据时,我得到的是低负数,所以推测存在缓冲区溢出问题。如果我在sqliteman中打开数据库并手动查询数据,则数据将正确返回,因此它必须与DBI或RSQLite配合使用。如何使用RSQLite从数据库检索大量数据? (缓冲区溢出?)

有没有办法通过RSQLite检索非常大的整数/浮点值没有这个问题?

这里是一个小例子:

library("DBI"); library("RSQLite") 
db.h <- dbConnect(RSQLite::SQLite(), dbname=":memory:") 
dbGetQuery(db.h, "CREATE TABLE test (a TEXT, b INT)") 
dbGetQuery(db.h, "INSERT INTO test VALUES ('value1', 282817178)") 
dbGetQuery(db.h, "INSERT INTO test VALUES ('value2', 15620693910)") 
result = dbGetQuery(db.h, "SELECT * FROM test") 
result 
dbDisconnect(db.h) 

我得到的输出如下所示:

>  a   b 
> 1 value1 282817178 
> 2 value2 -1559175274 

我使用RStudio 0.98.501(R版本3.0.2)在32位位Windows 7,如果这是相关的。

编辑:请注意,SQLite 3对内存和请求处理中的所有值使用64位整数。如下面的评论中所建议的那样使用BIGINT代替INT会产生相同的溢出问题。

+0

INT它被限制在2^32,约20亿。尝试BIGINT –

+0

正如我在下面对Dzamo Norton的回复中,似乎BIGINT和INT都指SQLite中的64位整数,而在原始问题中使用BIGINT而不是INT来生成完全相同的输出。 –

回答

1

This post on the RSQLite issue tracker显示这似乎是实施的已知问题/限制。它说这是(至少部分)与R处理不好,因为SQLite使用的是64位整数。

这里是一个似乎为我工作的一种变通方法:铸造大整数作为在SQL查询文本列,然后手动重新调整它的数值在R.

工作例如:

library("DBI"); library("RSQLite") 
db.h <- dbConnect(RSQLite::SQLite(), dbname=":memory:") 
dbGetQuery(db.h, "CREATE TABLE test (a TEXT, b INT)") 
dbGetQuery(db.h, "INSERT INTO test VALUES ('value1', 282817178)") 
dbGetQuery(db.h, "INSERT INTO test VALUES ('value2', 15620693910)") 
result = dbGetQuery(db.h, "SELECT a, CAST(b as TEXT) as b FROM test") 
result$b <- as.numeric(result$b); result 
dbDisconnect(db.h) 

输出:

 a   b 
1 value1 282817178 
2 value2 15620693910