Speed tweaks for pokedex load in SQLite
authorPetr Viktorin <encukou@gmail.com>
Sat, 8 Jan 2011 22:21:44 +0000 (23:21 +0100)
committerEevee <git@veekun.com>
Fri, 28 Jan 2011 05:51:30 +0000 (21:51 -0800)
pokedex/__init__.py
pokedex/db/load.py

index 2be0f80..45b4d7a 100644 (file)
@@ -137,7 +137,8 @@ def command_load(*args):
     pokedex.db.load.load(session, directory=options.directory,
                                   drop_tables=options.drop_tables,
                                   tables=tables,
-                                  verbose=options.verbose)
+                                  verbose=options.verbose,
+                                  safe=False)
 
 def command_reindex(*args):
     parser = get_parser(verbose=True)
@@ -158,7 +159,8 @@ def command_setup(*args):
     session = get_session(options)
     get_csv_directory(options)
     pokedex.db.load.load(session, directory=None, drop_tables=True,
-                                  verbose=options.verbose)
+                                  verbose=options.verbose,
+                                  safe=False)
 
     lookup = get_lookup(options, session=session, recreate=True)
 
index df0d0f1..e6b3287 100644 (file)
@@ -95,7 +95,7 @@ def _get_verbose_prints(verbose):
     return print_start, print_status, print_done
 
 
-def load(session, tables=[], directory=None, drop_tables=False, verbose=False):
+def load(session, tables=[], directory=None, drop_tables=False, verbose=False, safe=True):
     """Load data from CSV files into the given database session.
 
     Tables are created automatically.
@@ -115,6 +115,10 @@ def load(session, tables=[], directory=None, drop_tables=False, verbose=False):
 
     `verbose`
         If set to True, status messages will be printed to stdout.
+
+    `safe`
+        If set to False, load can be faster, but can corrupt the database if
+        it crashes or is interrupted.
     """
 
     # First take care of verbosity
@@ -128,6 +132,10 @@ def load(session, tables=[], directory=None, drop_tables=False, verbose=False):
     table_objs = [metadata.tables[name] for name in table_names]
     table_objs = sqlalchemy.sql.util.sort_tables(table_objs)
 
+    # SQLite speed tweaks
+    if not safe and session.connection().dialect.name == 'sqlite':
+        session.connection().execute("PRAGMA synchronous=OFF")
+        session.connection().execute("PRAGMA journal_mode=OFF")
 
     # Drop all tables if requested
     if drop_tables:
@@ -251,6 +259,10 @@ def load(session, tables=[], directory=None, drop_tables=False, verbose=False):
 
         print_done()
 
+    # SQLite check
+    if session.connection().dialect.name == 'sqlite':
+        session.connection().execute("PRAGMA integrity_check")
+
 
 
 def dump(session, tables=[], directory=None, verbose=False):