craano
25.12.11, 14:46
Hallo,
ich frage mich gerade, auf welche Art und Weise man viele Datensätze am schnellsten in eine (MySQL-)Datenbank einfügen kann?
Irgendwie klemmt dort bei mir die Performance.
Als Beispiel erstelle ich einmal einen (Mini-)Rainbow-Table und füge die Werte in eine Datenbank ein.
Versuch 1:
1. Ich erstelle die Wertepaare und schreibe diese in eine Datei.
#!/usr/bin/python
import string
import hashlib
import MySQLdb as mdb
l1 = string.lowercase[:26]
n = 0
t = '\t'
z = '\n'
ns = ''
row = ''
md5 = ''
gen = ((a,b,c) for a in l1 for b in l1 for c in l1)
print "use p_db;"
for i in gen:
i = tuple(i)
i = ''.join(i)
n = n + 1
md5 = hashlib.md5(i).hexdigest()
ins = "insert into p_md5(num,pattern,md5) values (%d,\'%s\',\'%s\');" % (n,i,md5)
print ins
2. Dann lese ich die Dateien mit msql ein
$ time python many.mysql.gen_lst.py > test
real 0m0.440s
user 0m0.412s
sys 0m0.016s
$ ls -lh test i
-rw-r--r-- 1 craano users 1,6M 25. Dez 15:29 test
$ time mysql -u p_user -p < test
Enter password:
Das breche ich dann irgendwann ab, weil die einzelnen Zeilen einfach sehr langsam in die Datenbank eingefügt werden.
2. Versuch
Ich füge aus dem kleinem Python Skript mittels MySQLdb direkt in die DB ein:
import string
import hashlib
import MySQLdb as mdb
l1 = string.lowercase[:26]
n = 0
t = '\t'
z = '\n'
ns = ''
row = ''
md5 = ''
gen = ((a,b,c) for a in l1 for b in l1 for c in l1)
con = None
con = mdb.connect('localhost', 'p_user', 'p_pwd', 'p_db')
cur = con.cursor()
for i in gen:
i = tuple(i)
i = ''.join(i)
n = n + 1
md5 = hashlib.md5(i).hexdigest()
with con:
ins = "insert into p_md5(num,pattern,md5) values (%d,\"%s\",\"%s\");" % (n,i,md5)
cur.execute(ins)
con.close()
print n
Das dauert mehr oder weniger genauso lange wie das einlesen aus der Datei.
Igendwie steht aber der zeitliche Aufwand des Einfügens in keinem Verhältnis zum Erzeugen der Hashes.
Als sehr unerfahrener und nur privater Datenbankuser frage ich mich nun, ob die Datenbank immer der Flaschenhals ist oder gibt es eine schnellere Möglichkeiten vielen Zeilen in eine DB einzulesen (vieleicht aus einer csv - Datei)?
Übrigens ich habe das auch mit Postgresql versucht, ist auch nicht wirklich besser.
Ein Rat, nimm stärkere Hardware, nutzt mir nicht, weil das ganze nur ein privater Versuch auch meinem Lappi ist und ich einfach nur wissen möchte, wie man eine Datenbank optimal ansprechen kann.
Wenn ich nun Hashes aus vier oder fünf Stellen (26**4, 26 **5) erstelle, sind diese in sehr kurzer Zeit erstellt. Das Datenbank einfügen dauert dann eeeeeewwwwwwwiiiiiiig!
Gesegnetes Fest Euch allen
craano
ich frage mich gerade, auf welche Art und Weise man viele Datensätze am schnellsten in eine (MySQL-)Datenbank einfügen kann?
Irgendwie klemmt dort bei mir die Performance.
Als Beispiel erstelle ich einmal einen (Mini-)Rainbow-Table und füge die Werte in eine Datenbank ein.
Versuch 1:
1. Ich erstelle die Wertepaare und schreibe diese in eine Datei.
#!/usr/bin/python
import string
import hashlib
import MySQLdb as mdb
l1 = string.lowercase[:26]
n = 0
t = '\t'
z = '\n'
ns = ''
row = ''
md5 = ''
gen = ((a,b,c) for a in l1 for b in l1 for c in l1)
print "use p_db;"
for i in gen:
i = tuple(i)
i = ''.join(i)
n = n + 1
md5 = hashlib.md5(i).hexdigest()
ins = "insert into p_md5(num,pattern,md5) values (%d,\'%s\',\'%s\');" % (n,i,md5)
print ins
2. Dann lese ich die Dateien mit msql ein
$ time python many.mysql.gen_lst.py > test
real 0m0.440s
user 0m0.412s
sys 0m0.016s
$ ls -lh test i
-rw-r--r-- 1 craano users 1,6M 25. Dez 15:29 test
$ time mysql -u p_user -p < test
Enter password:
Das breche ich dann irgendwann ab, weil die einzelnen Zeilen einfach sehr langsam in die Datenbank eingefügt werden.
2. Versuch
Ich füge aus dem kleinem Python Skript mittels MySQLdb direkt in die DB ein:
import string
import hashlib
import MySQLdb as mdb
l1 = string.lowercase[:26]
n = 0
t = '\t'
z = '\n'
ns = ''
row = ''
md5 = ''
gen = ((a,b,c) for a in l1 for b in l1 for c in l1)
con = None
con = mdb.connect('localhost', 'p_user', 'p_pwd', 'p_db')
cur = con.cursor()
for i in gen:
i = tuple(i)
i = ''.join(i)
n = n + 1
md5 = hashlib.md5(i).hexdigest()
with con:
ins = "insert into p_md5(num,pattern,md5) values (%d,\"%s\",\"%s\");" % (n,i,md5)
cur.execute(ins)
con.close()
print n
Das dauert mehr oder weniger genauso lange wie das einlesen aus der Datei.
Igendwie steht aber der zeitliche Aufwand des Einfügens in keinem Verhältnis zum Erzeugen der Hashes.
Als sehr unerfahrener und nur privater Datenbankuser frage ich mich nun, ob die Datenbank immer der Flaschenhals ist oder gibt es eine schnellere Möglichkeiten vielen Zeilen in eine DB einzulesen (vieleicht aus einer csv - Datei)?
Übrigens ich habe das auch mit Postgresql versucht, ist auch nicht wirklich besser.
Ein Rat, nimm stärkere Hardware, nutzt mir nicht, weil das ganze nur ein privater Versuch auch meinem Lappi ist und ich einfach nur wissen möchte, wie man eine Datenbank optimal ansprechen kann.
Wenn ich nun Hashes aus vier oder fünf Stellen (26**4, 26 **5) erstelle, sind diese in sehr kurzer Zeit erstellt. Das Datenbank einfügen dauert dann eeeeeewwwwwwwiiiiiiig!
Gesegnetes Fest Euch allen
craano