Как получить большие числа из базы данных с помощью RSQLite? (Переполнение буфера?)

У меня есть база данных с различными счетчиками токенов и частот. Когда я пытаюсь получить их из R с помощью RSQLite, я получаю низкие отрицательные числа, поэтому, предположительно, возникает проблема с переполнением буфера. Если я открою базу данных, скажем, в 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

Я использую RStudio 0.98.501 (версия R 3.0.2) в 32-разрядной версии Windows 7, если это вообще актуально.

Изменить: обратите внимание, что SQLite 3 использует 64-битные целые числа для всех значений в памяти и при обработке запросов. Использование BIGINT вместо INT, как предлагается в комментариях ниже, приводит к той же проблеме с переполнением.


person Florian Breit    schedule 05.09.2015    source источник
comment
INT он ограничен 2 ^ 32, или около 2 миллиардов. Попробуйте БОЛЬШОЙ   -  person Serban Tanasa    schedule 06.09.2015
comment
Как и в моем ответе Дзамо Нортону ниже, похоже, что BIGINT и INT оба относятся к 64-битным целым числам в SQLite, и использование BIGINT вместо INT в моем примере в исходном вопросе дает точно такой же результат.   -  person Florian Breit    schedule 06.09.2015


Ответы (1)


Это сообщение в системе отслеживания проблем RSQLite показывает, что это известная проблема/ ограничение реализации. В нем говорится, что это (по крайней мере частично) связано с тем, что R плохо справляется с 64-битными целыми числами, используемыми SQLite.

Вот обходной путь, который, кажется, работает для меня: приведите столбец с большими целыми числами к TEXT в 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
person Florian Breit    schedule 06.09.2015