[R-sig-DB] Segmentation faults using RSQLite
Richard Bourgon
bourgon @end|ng |rom eb|@@c@uk
Mon Nov 6 14:33:58 CET 2006
I'm relatively new to accessing databases from within R, and have
been having trouble with segmentation faults when using RSQLite.
My application requires a single table of doubles with 225 columns
and about 6M rows. The following session transcript mimics this
table, and consistently produces errors: sometimes an immediate seg
fault, and sometimes one of several odd but non-critical error
messages, an example of which appears below. (In the latter case, if
I try to rerun the bit that generated the error, then I usually get
the seg fault.)
Small numbers of retrievals always work fine (i.e., the single
"get_table()" call below, or looping only 50 or 100 times), while
large numbers lead to the errors. If I reduce the number of columns
in the table, I also seem to avoid the errors.
Some version info is given below, but please let me know if anything
else would be helpful. I didn't use the fancy options when installing
the RSQLite package, so as best I can tell, it's using the compiled
library that gets built in the sqlite/lib directory, inside the
package's own directory.
Any advice would be greatly appreciated.
- Richard
**** R session transcript
> version
_
platform x86_64-unknown-linux-gnu
arch x86_64
os linux-gnu
system x86_64, linux-gnu
status
major 2
minor 4.0
year 2006
month 10
day 03
svn rev 39566
language R
version.string R version 2.4.0 (2006-10-03)
> installed.packages()[installed.packages()[,"Package"] %in% c
("RSQLite","DBI"), c(1,3,10)]
Package Version Built
DBI "DBI" "0.1-11" "2.4.0"
RSQLite "RSQLite" "0.4-9" "2.4.0"
> library( RSQLite )
Loading required package: DBI
> drv <- SQLite()
> con <- dbConnect( drv, "testing.db" )
> table.name <- "testing"
> data <- as.data.frame( matrix( rnorm( 225000 ), ncol = 225 ) )
> dbWriteTable( con, "testing", data, row.names = F, overwrite = T )
[1] TRUE
> get_data <- function( indices, con, table_name ) {
+ query <- paste(
+ "select * from",
+ table_name,
+ "where _ROWID_ in (",
+ paste( indices, collapse = "," ),
+ ")"
+ )
+ dbGetQuery( con, query )
+ }
> get_data( 1:3, con, table.name )[,1:5]
V1 V2 V3 V4 V5
1 -1.8803772 1.00073121 -0.3496548 1.027102 -0.7882639
2 -0.9140920 -0.02242254 -1.4682685 0.375063 -0.6137175
3 0.4243143 -0.15502231 1.6846590 1.210313 -0.4726484
> # No error with just one interation
> temp <- lapply( 1:50, function(i) get_data( 1:3, con, table.name ) )
> # No error with 50 iterations
> temp <- lapply( 1:2000, function(i) get_data( 1:3, con,
table.name ) )
Error in sqliteResultInfo(dbObj, ...) : SET_STRING_ELT() can only be
applied to a 'character vector', not a 'NULL'
> # Rerunning now typically generates a segmentation fault
> temp <- lapply( 1:2000, function(i) get_data( 1:3, con,
table.name ) )
*** caught segfault ***
address 0x2, cause 'memory not mapped'
Traceback:
1: sqliteResultInfo(dbObj, ...)
2: dbGetInfo(res, "completed")
3: dbGetInfo(res, "completed")
4: .class1(object)
5: .class1(object)
6: is(object, Cl)
7: .valueClassTest(standardGeneric("dbHasCompleted"), "logical",
"dbHasCompleted")
8: dbHasCompleted(rs)
9: sqliteQuickSQL(conn, statement, ...)
10: dbGetQuery(con, query)
11: dbGetQuery(con, query)
12: get_data(1:3, con, table.name)
13: FUN(c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, <truncated>, 1998, 1999,
2000)[[152]], ...)
14: lapply(1:2000, function(i) get_data(1:3, con, table.name))
Possible actions:
1: abort (with core dump)
2: normal R exit
3: exit R without saving workspace
4: exit R saving workspace
Selection: 3
Process R exited abnormally with code 70 at Mon Nov 6 12:22:14 2006
More information about the R-sig-DB
mailing list