[R-sig-DB] Fwd: concurrent reading/writing in "chunks" with RSQLite (need some help troubleshooting)

Jonathan Greenberg greenberg @end|ng |rom ucd@v|@@edu
Mon Jun 28 23:15:32 CEST 2010


A bit more troubleshooting, see the modded code below.  I'm noticing
that dbExistsTable() appears to be failing.  If you run the code
below, you'll see that the output is:

[1] "row extraction begins: 0"
[1] "making new table"
[1] "row extraction begins: 3"
[1] "making new table"
[1] "row extraction begins: 6"
[1] "making new table"
[1] "row extraction begins: 9"
[1] "making new table"

E.g. it keeps seeing dbExistsTable() as FALSE even though, after the
first pass, it should have created that table.  I through in some
other things I thought might work (placing the dbConnect statement for
the writing inside the while() loop, and adding a dbCommit()
statement), but none of these worked either.  Is it possible that the
dbDisconnect() statement is not behaving properly?

Thanks a ton for any help you can give me!

--j

***

require(RSQLite)
mysqldb='test.sqlite'
fetch_n=3

# Create a small table.
somedata=data.frame(data1=seq(1:10),data2=seq(1:10)*3)

# Make a table with it.
m <- dbDriver("SQLite",flags = SQLITE_RO)
con=dbConnect(m, dbname=mysqldb)
dbWriteTable(con,"TABLEA",somedata,overwrite=TRUE)
dbDisconnect(con)

# Now we want to read from TABLEA in "chunks" and write to TABLEB.
read_con=dbConnect(m, dbname=mysqldb)
read_query=dbSendQuery(read_con,"SELECT * FROM TABLEA")

while(!dbHasCompleted(read_query))
{
       print(dbGetRowCount(read_query))
       write_con=dbConnect(m, dbname=mysqldb)
       read_chunk=fetch(read_query,fetch_n)
       new_data=data.frame(data3=read_chunk$data1*4,data4=read_chunk$data2*4)
       # Let's check dbexists with a different connection.
       tables_exists_con=dbConnect(m, dbname=mysqldb)
       table_exists=dbExistsTable(tables_exists_con, "TABLEB")
       dbDisconnect(tables_exists_con)

       if(!table_exists)
       {
               print("making new table")
               dbWriteTable(write_con,"TABLEB",new_data)
       } else
       {
               print("append to existing table")
               dbWriteTable(write_con,"TABLEB",new_data, append=TRUE)
       }
       dbCommit(write_con)
       dbDisconnect(write_con)
}
dbClearResult(read_query)
dbDisconnect(read_con)


On Mon, Jun 28, 2010 at 1:52 PM, Seth Falcon <seth using userprimary.net> wrote:
> Hi,
>
> A couple of ideas below...  I will try to reproduce this later.
>
> On Mon, Jun 28, 2010 at 1:26 PM, Jonathan Greenberg
> <greenberg using ucdavis.edu> wrote:
>> I'm trying to cycle through a database, reading a chunk of data from
>> one table in the DB, processing this data chunk, and then writing the
>> output to another table in the database.  I'm having to set the
>> fetch(n=) option because the database is too large to read the entire
>> thing into memory at once.  Here's my sample code:
>>
>> ***
>>
>> require(RSQLite)
>> mysqldb='test.sqlite'
>> fetch_n=3
>>
>> # Create a data table.
>> somedata=data.frame(data1=seq(1:10),data2=seq(1:10)*3)
>>
>> # Make a table in our database with it.
>> m <- dbDriver("SQLite")
>> con=dbConnect(m, dbname=mysqldb)
>> dbWriteTable(con,"TABLEA",somedata,overwrite=TRUE)
>> dbDisconnect(con)
>>
>> # Now we want to read from TABLEA in "chunks" and write to TABLEB.
>> read_con=dbConnect(m, dbname=mysqldb)
>> write_con=dbConnect(m, dbname=mysqldb)
>
> You might try setting the flags on the read connection to indicate
> that it is read only:
>
>  read_con = dbConnect(m, dbname = mysqldb, flags = SQLITE_RO)
>
> There are some details in ?sqliteSupport
>
> I wonder if it would make a difference if you created the destination
> table (TABLEB) earlier (say before opening read/write cons).
>
>> read_query=dbSendQuery(read_con,"SELECT * FROM TABLEA")
>>
>> while(!dbHasCompleted(read_query))
>> {
>>        read_chunk=fetch(read_query,fetch_n)
>>        new_data=data.frame(data3=read_chunk$data1*4,data4=read_chunk$data2*4)
>>        if(!dbExistsTable(write_con, "TABLEB"))
>>        {
>>                dbWriteTable(write_con,"TABLEB",new_data)
>>        } else
>>        {
>>                dbWriteTable(write_con,"TABLEB",new_data, append=TRUE)
>>        }
>> }
>> dbDisconnect(read_con)
>> dbDisconnect(write_con)
>>
>> **
>>
>> I am getting this error:
>>
>> Warning messages:
>> 1: In sqliteWriteTable(conn, name, value, ...) :
>>  RS_SQLite_exec: could not execute1: database is locked
>> 2: In sqliteWriteTable(conn, name, value, ...) :
>>  RS_SQLite_exec: could not execute1: database is locked
>> 3: In sqliteWriteTable(conn, name, value, ...) :
>>  RS_SQLite_exec: could not execute1: database is locked
>>> dbDisconnect(read_con)
>> [1] TRUE
>> Warning message:
>> In sqliteCloseConnection(conn, ...) :
>>  RS-DBI driver warning: (closing pending result sets before closing
>> this connection)
>
> You can get rid of this warning by calling dbClearResult on your query
> result object.
>
>>> dbDisconnect(write_con)
>> [1] TRUE
>>
>> Any suggestions on how to fix this?  Thanks!
>
> I will try and have a closer look over the next couple of days.
>
> + seth
>
> --
> Seth Falcon | @sfalcon | http://userprimary.net/
>




More information about the R-sig-DB mailing list