[racket] frequent crashes on Windows 7 64-bit
Should the documentation mention this at the ffi level as well as in the
Inside manual?
Sam
On Nov 2, 2013 12:49 AM, "Matthew Flatt" <mflatt at cs.utah.edu> wrote:
> I tracked down the problem in the SQLite binding and Racket's GC.
>
> It turns out that an "interior" pointer retains an enclosing allocated
> object only when the pointer refers to an even address. A pointer that
> refers to an odd address is always treated by the GC as a fixnum (and
> it's not practical to change the GC to support odd-valued pointers into
> an allocated object). I've changed the documentation of
> scheme_malloc_allow_interior() to explain the constraint.
>
> Meanwhile, statement preparation in the SQLite API can return an
> odd-valued pointer into the middle of a query string (which had been
> allocated as 'atomic-interior). If a GC occurred at just the wrong
> time, then statement preparation could go wrong --- more so on Windows
> than other platforms, since the GC releases pages more eagerly on
> Windows. I've adjusted the SQLite binding to work within the newly
> documented constraint on interior pointers.
>
> I didn't find any other code that could end up with odd-valued
> pointers, but FFI users beware.
>
> At Wed, 30 Oct 2013 13:47:19 -0400, Ryan Culpepper wrote:
> > I don't have an answer about the crash, but Matthew has narrowed it down
> > to the vicinity of statement preparation, so I can make a recommendation
> > about how to avoid it: Use a (constant) parameterized statement instead
> > of string-append. For example, replace the main function with this:
> >
> > (define (main n)
> > (call-with-transaction
> > (current-db)
> > (lambda ()
> > (for ([i (expt 10 n)])
> > (define x_i (x i))
> > (query-exec
> > (current-db)
> > "INSERT INTO sines (id, x, sine_x) VALUES (?,?,?)"
> > i x_i (sin x_i))))))
> >
> > With that change, I'm able to run (main 6) in about 30 seconds and (main
> > 7) in about 5 minutes on a 2GB, 1 processor Windows VM running within
> Linux.
> >
> > The db connection caches prepared statements inside of transactions, so
> > by using a constant parameterized statement, you save parsing time. By
> > my measurements, this version takes less than half the time of
> > Matthias's. (In addition to other benefits like security from SQL
> > injection.)
> >
> > Ryan
> >
> >
> > On 10/29/2013 06:19 PM, Andrews, Kyle (KC) wrote:
> > > I just tried running your code 3 times on `(main 7)' and twice on
> `(main 6)'
> > and it has crashed each time. But I was worried that somehow I was
> running out
> > of memory (even though I have 16 Gb available), so I saved the database
> to
> > file using:
> > >
> > > (define current-db (make-parameter (sqlite3-connect #:database
> "buggy.db"
> > #:mode 'create)))
> > >
> > > [Note that if you want to run the script again after this, you have to
> > comment out the next line and remove the #:mode 'create keyword]
> > >
> > > DrRacket still crashes with (main 6) and (main 7). Since (main 7)
> should
> > create a table with 10^7 = 10 million rows and 3 columns, I don't see how
> > SQLite could be running out of space. SQLite documentation [1] says it
> should
> > be able to support at least 10^13 rows and 140 terabytes of data.
> Otherwise,
> > I'm not sure what other limits I could be running into. And my actual
> problem
> > is also using an on-disk database, for which I have managed to store a
> paltry
> > 47 mb (which is something like 1/300 of what I need to load).
> > >
> > > [1] http://www.sqlite.org/limits.html
> > >
> > > P.S. -- Happy Birthday! (I saw the Easter egg in DrRacket today)
> > >
> > > -----Original Message-----
> > > From: Matthias Felleisen [mailto:matthias at ccs.neu.edu]
> > > Sent: Tuesday, October 29, 2013 4:51 PM
> > > To: Andrews, Kyle (KC)
> > > Cc: Racket mailing list (users at racket-lang.org)
> > > Subject: Re: [racket] frequent crashes on Windows 7 64-bit
> > >
> > >
> > > Once I had fixed the typo in your program, I was able to run this loop
> > without ado:
> > >
> > >> (for ((i (in-range 9))) (collect-garbage) (collect-garbage) (time
> > >> (main i)))
> > > cpu time: 1 real time: 1 gc time: 0
> > > cpu time: 5 real time: 6 gc time: 0
> > > cpu time: 9 real time: 9 gc time: 0
> > > cpu time: 77 real time: 77 gc time: 0
> > > cpu time: 736 real time: 741 gc time: 14 cpu time: 7666 real time:
> 7703 gc
> > time: 393 ...
> > >
> > > As far as I can tell time consumption grows by one order of magnitude
> as
> > increase the size of the database entries by an order of magnitude. I
> don't
> > have the time to it for 10, 11, and 12 but is it possible that something
> > external/size-wise hits you here?
> > >
> > >
> > >
> > > #lang racket
> > >
> > > (require db)
> > >
> > > (define current-db (make-parameter (sqlite3-connect #:database
> 'memory)))
> > >
> > > (query-exec (current-db) "CREATE TABLE sines(id INTEGER, x, sine_x)")
> > >
> > > (define (x i) (+ (- pi) (/ i (* 1000 pi))))
> > >
> > > (define (main n)
> > > (call-with-transaction
> > > (current-db)
> > > (lambda ()
> > > (for ([i (expt 10 n)])
> > > (define x_i (x i))
> > > (query-exec
> > > (current-db)
> > > (string-append
> > > "INSERT INTO sines(id, x, sine_x) VALUES("
> > > (number->string i) ", "
> > > (number->string x_i) ", "
> > > (number->string (sin x_i)) ")"))))))
> > >
> > > (provide main)
> > >
> > >
> > >
> > > On Oct 29, 2013, at 4:32 PM, "Andrews, Kyle (KC)" <KCAndrews at dow.com>
> wrote:
> > >
> > >> I've been trying to upload data into an SQLite database using Racket
> from
> > Windows 7 64-bit and both Racket.exe and DrRacket.exe keep crashing
> before the
> > upload finishes. I've had crashes on long-running programs in DrRacket
> on
> > Windows 7 before, so I don't want to say for sure that it's the fault of
> the
> > db library. However, I do know is that the crashes have been happening
> > repeatedly with this project and given the amount of data I need to
> upload, it
> > is impractical to keep restarting Racket in the hopes that it will
> eventually
> > finish. Racket is crashing with both 5.3.6 as well as the latest nightly
> > build you have installers for: 5.90.0.9. I have attached a sample
> script
> > which creates an in-memory sqlite database and populates it with a
> trillion
> > sines which crashes on me after a while, just like my actual script. My
> > Racket VM (at least in DrRacket) defaults to 2048 Mb.
> > >>
> > >> Below is what error information Windows gives upon the crash:
> > >>
> > >> Problem signature:
> > >> Problem Event Name: APPCRASH
> > >> Application Name: Racket.exe
> > >> Application Version: 5.90.0.1
> > >> Application Timestamp: 525e4550
> > >> Fault Module Name: libracket3m_9r9qx5.dll
> > >> Fault Module Version: 0.0.0.0
> > >> Fault Module Timestamp: 525e454e
> > >> Exception Code: c0000005
> > >> Exception Offset: 00000000002b6081
> > >> OS Version: 6.1.7601.2.1.0.256.4
> > >> Locale ID: 1033
> > >> Additional Information 1: 9e37
> > >> Additional Information 2: 9e37a01f62fc211801609d8b20878795
> > >> Additional Information 3: 4bbb
> > >> Additional Information 4: 4bbb32ba4ab4514f5750e1fc710f6223
> > >>
> > >> Let me know if there is any other information I can provide.
> > >> Regards,
> > >>
> > >> Kyle
> > >>
> > >> <bug.rkt>____________________
> > >> Racket Users list:
> > >> http://lists.racket-lang.org/users
> > >
> > >
> > >
> > >
> > > ____________________
> > > Racket Users list:
> > > http://lists.racket-lang.org/users
> > >
> >
> > ____________________
> > Racket Users list:
> > http://lists.racket-lang.org/users
> ____________________
> Racket Users list:
> http://lists.racket-lang.org/users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20131102/19592e5e/attachment-0001.html>