da in vielen Foren und auf vielen Seiten gesagt wird, dass SQLite schneller als MySQL sei habe ich ein kleines Skript geschrieben, um die Geschwindigkeit der SQLite-Datenbank zu testen. Den lauffähigen Quelltext findet ihr unten aufgeführt, so wie meine Laptop-Angaben. Dazu werdet ihr weiter unten die Zeit für die INSTERTS sehen. Vor diesem Hintergrund möchte ich euch fragen, ob die Zeiten akzeptable sind, oder ob es an meinem Quelltext liegt, dass die automatisierte Einträge so "langsam" sind? Ich habe mich bewusst bei diesem Test auf ORM verzichtet, da das ORM-Konzept wesentlich langsamer ist, als wenn man mit DDL (Data Definition Language) arbeitet. Mir ist durchaus bewusst, dass man in Sachen Geschwindigkeit bei Python an falscher Adresse ist. Mir geht es viel mehr darum, ob die Zeit-Werte, die gemessen wurden, in Ordnung sind, oder ob es noch Optimierungsbedarf an meinem Quelltext gibt? Den Test habe ich bei 10.000.000 INSERTS abgebrochen. 2 Tage haben mir gereicht. Für mein Gefühl dauerte es einfach zu lange.
Laptop-Leistung
Quelltext:Betriebssystem: Windows 7 Home
2x CPU: 2 GHz (3 MB Cache)
System: 64 Bit
Arbeitsspeicher: 4 GB
Code: Alles auswählen
#!/usr/bin/env python
import os
import sys
import time
from datetime import datetime
from sqlalchemy import create_engine
from sqlalchemy import exc
BASE_PATH = os.path.dirname(os.path.abspath("__file__"))
# default db engine
DB_URI = 'sqlite:///test_database.sqlite'
def insert_record(range_int):
conn = connect_database(DB_URI)
try:
for x in (range(int(range_int))):
result = conn.execute("INSERT INTO test_table (some_row) VALUES ('{var_1}')".format(var_1="TestName %d" % (x)))
except exc.IntegrityError as InErr:
print "InErr", InErr
conn.close()
def connect_database(database_path):
engine = create_engine(database_path, echo=False)
conn = engine.connect()
return conn
def create_table():
# Geneeal information
table_name = "test_table"
id_row = table_name+"_id"
some_name = "some_row"
# get connections-string
conn = connect_database(DB_URI)
createing_table = """CREATE TABLE IF NOT EXISTS {name_table} (
{profile_name_id} INTEGER PRIMARY KEY AUTOINCREMENT,
{some_name} VARCHAR(100),
UNIQUE ({some_name}))""".format(name_table=table_name,
profile_name_id=id_row,
some_name=some_name)
conn.execute(createing_table)
conn.close()
def main():
# First always delete the data base for this testing
os.remove("test_database.sqlite")
# Second create a new database with empty tables, rows and columns
create_table()
# Interactive from user
enter_range = raw_input("How many records to be inserted? (only numbers): ")
# start to stopp the time
start_time = datetime.now()
# Call function to insert data X times items
insert_record(enter_range)
# end with to stopp the time
end_time = datetime.now()
# Show how much time has been elapsed.
print('Duration: {}'.format(end_time - start_time))
if __name__ == '__main__':
main()
Inserts: 10 = Duration: 0:00:00.074000
---------------------------------------------------------
Inserts: 100 = Duration: 0:00:01.174000
---------------------------------------------------------
Inserts: 1.000 = Duration: 0:00:11.701000
---------------------------------------------------------
Inserts: 10.000 = Duration: 0:02:14.843000
---------------------------------------------------------
Inserts: 100.000 = Duration: 0:21:02.627000
---------------------------------------------------------
Inserts: 1.000.000 = Duration: 4:09:03.760000
---------------------------------------------------------
Inserts: 10.000.000 = Duration: 2 days, 16:20:43.034000