2017-02-08 34 views
7

ile karşılaştırıldığında çok uzun zaman alır. Hafızada yüklendiğinde yaklaşık olarak 30m satır, 6 sütun, yaklaşık 2gb gibi oldukça büyük bir mysql tablom var.Mysql tablosunu python'a yükleme işlemi, R

Hem python hem de R ile çalışıyorum. R'de, tabloyu belleğe yükleyebilirim ve yaklaşık 90 saniye sürer. Ama pythonda 40 dakika sürer.

Hem sqlalchemy hem de düz pymysql ile denedim. Kod sqlalchemy ile, örneğin, basittir:

db_engine = sqlalchemy.create_engine("mysql+pymysql://user:[email protected]/database") 
cnx = db_engine.connect() 
table = pd.read_sql('select * from my_table',cnx) 
cnx.close() 

sqlalchemy olmadan:

cnx = mysql.connector.connect(**db_details) 
cursor = cnx.cursor() 
cursor.execute('select * from my_table') 
table = pd.DataFrame(data=list(cursor),columns = cursor.column_names) 
cnx.close() 

Her iki şekilde de bana çok mantıklı değil R, çok daha yavaş, fazla. Neden bu, ve hızlandırmak için herhangi bir yolu var mı? Bir hack bile yapardı.

Eklemek gerekirse, pandaların bu kadar uzun sürecek bir ilgisi yoktur. İkinci kod snippet'inde, list(cursor)'u sadece bir DataFrame pandasına yerleştirmek yerine döndürürsem, (temelde) uzun sürüyor.

Açık Düzenleme: DB, R/Python ile aynı makinede çalışıyor, bu nedenle her şey çıktı açısından aynı olmalıdır.

UR yılında

DBI kullanıyorum ve kullandığım R kodudur (temelde) bu:

ÇÖZÜLDÜ
require(DBI) 
cnx <- dbConnect(dbDriver("MySQL"),dbname="database",username="user",password="pass",host="host") 
table <- dbGetQuery(cnx,"select * from my_table") 

******** (ÇOK) ********

Özellikle @roganjosh'dan gelen yararlı yorumlar sayesinde, sorunun nedeni, varsayılan mysql bağlayıcının C yerine python ile yazılmasıdır, bu da onu çok yavaşlatır. Çözüm, doğal bir C konektörü olan MySQLdb kullanmaktır. MySQLdb sadece Ancak piton 2. desteklenir çünkü Kobrayla piton 3 çalıştıran benim özel kurulumda

, bu isimle mysqlclient altında piton 3 MySQLdb bir uygulamasıdır, orada mümkün değildi.

Bu uygulamayı kullanarak, tüm tabloyu okumak için yaklaşık 5 dakikaya kadar, R kadar hızlı değil, 40'tan çok daha kısa bir süre geçiyor.

+0

Dönüştürmeyi pandalar veri çerçevesine ayırırdım ancak bu gerçekten ilginç –

+0

İyi bir nokta, bunu yaptım. Bu pandalar dönüşümü değil. Sadece satırların listesini almak yaklaşık 40 dakika sürmektedir. – mrip

+0

Ağ var mı? Veritabanınız açıkken aynı makinede komut dosyasını çalıştırıyor musunuz? – alecxe

cevap

1

Özellikle @roganjosh'dan gelen yararlı yorumlar sayesinde, sorunun nedeni, varsayılan mysql bağlayıcısının C yerine python ile yazılmasıdır. Çözüm, doğal bir C konektörü olan MySQLdb kullanmaktır. MySQLdb sadece Ancak piton 2. desteklenir çünkü Kobrayla piton 3 çalıştıran benim özel kurulumda

, bu isimle mysqlclient altında piton 3 MySQLdb bir uygulamasıdır, orada mümkün değildi.

Bu uygulamayı kullanarak, tüm tabloyu okumak için yaklaşık 5 dakikaya kadar, R kadar hızlı değil, 40'tan çok daha kısa bir süre geçiyor.

Hala bunu hızlandıracak önerilere hala açığım, ama tahminim bu kadar iyi olacak.

0

Ayrıca umysqldb adapter ile kullanılabilen saf C/C++ ultramysql MySQL driver da vardır. Projeler aktif değil, ancak bir kerelik bir şey için kullanılabilir olabilir - Ben onları üretimde kullanmazdım.

pymysql, bir Python sürücüsü olduğundan, PyPy üzerinde çalıştırmayı deneyebilirsiniz.