gpt4 book ai didi

r - 如何使用 RSQLite 从数据库中检索大量数据? (缓冲区溢出?)

转载 作者:搜寻专家 更新时间:2023-10-30 23:43:15 24 4
gpt4 key购买 nike

我有一个包含各种 token 和频率计数的数据库。当我尝试使用 RSQLite 从 R 中检索这些时,我得到的负数很低,因此可能存在缓冲区溢出问题。如果我在 say sqliteman 中打开数据库并手动查询它,数据会正确返回,所以它一定与 DBI 或 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

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

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

最佳答案

This post on the RSQLite issue tracker表明这似乎是实现的一个已知问题/限制。它说这是(至少部分)与 R 不能很好地管理 SQLite 使用的 64 位整数有关。

这里有一个似乎对我有用的解决方法:在 SQL 查询中将具有大整数的列转换为 TEXT,然后在 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

关于r - 如何使用 RSQLite 从数据库中检索大量数据? (缓冲区溢出?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32423330/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com