[Biopython-dev] BioSQL : BatchLoader
Nick Loman
n.j.loman at bham.ac.uk
Tue Apr 22 12:50:36 EDT 2008
Dear biopython-developers,
As importing data into PostgreSQL is much faster when using the batch
"COPY" method I decided I would hack BioSQL.Loader to produce COPY
statements for the bulk of the data in a typical GenBank file.
As index updating/foreign key checking is also slow, I split the BioSQL
schema. I put table definitions in one file and then indexes/foreign key
constraints in a separate one.
I import the schema file, then apply indexes/FK only after the data is
loaded. Caveat, pbviously this can't be done on a "live" database and it
relies on only a single import process being run at any one time.
A modified 'Loader' uses a new class called 'FakeTable'. FakeTable acts
as a very, very basic data store attempting to simulate the behavior of
Postgres. FakeTable.dump() outputs COPY statements to stdout instead of
SQL commands.
I benchmarked load_seqdatabase.pl vs. BioSQL.loader vs. FakeTable with a
GenBank file 42MB large (microbial32.genomic.gbff from RefSeq).
load_seqdatabase.pl - not directly comparable as needs foreign
keys/rules to run correctly, but
conservatively >20 minutes
BioSQL.Loader/psyco - 4 minutes, 54 seconds
BatchLoader/psyco - 1 minute, 38 seconds
+Import the output - 8 seconds
Postgres 8.3.1, Gentoo/Linux, 8GB RAM.
As the number of sequence files increases, there should be even greater
gains, as the interactive version will take longer to execute each query.
This is not production-quality code but might act as a starting poing
for hacking about with. I would be grateful for any comments. If the
team felt this would be a useful inclusion into BioPython I am happy to
work it up a bit more.
A MySQL compatible version would not be very hard, for example.
I reckon this could be faster, for example the sequence parsing could be
threaded on a multi-core machines.
Code is here:
http://pathogenomics.bham.ac.uk/nick/snippets/biopython-sql/
I'd be grateful for any feedback on how this might be improved, and how
we can make it even faster!
Many thanks
Nick.
More information about the Biopython-dev
mailing list