我想将Pandas数据帧作为一个整体放在MS SQL Server数据库的表中。像我这样的普通用户不允许使用BULK INSERT。我正在使用pyodbc连接到我的数据库。我正在使用熊猫0.13.1。我在某处读到了从版本0.14开始,你可以使用to_sql方法,因此它对我的pandas数据帧不可用。因此我使用了迭代器。我的数据框有2列:Col1和Col2。
我的代码工作正常:
import pandas as pd
import numpy as np
df= pd.DataFrame({'list':np.random.rand(100)})
html_table = df.to_html()
如上所述,上面的代码正在运行,但速度很慢...... 我该怎么做才能加快速度?
答案 0 :(得分:1)
您遇到的瓶颈是您的代码为DataFrame中的每一行发送一个INSERT语句。也就是说,对于样本数据文件
var input = new Subject<Price>();
IObservable<IList<Price>> query =
input
.Publish(i =>
Observable
.Create<IList<Price>>(o =>
{
var timeBuffer =
Observable
.Timer(TimeSpan.FromSeconds(10.0))
.Select(n => Unit.Default);
var flush =
i
.Where(p => p.IS_IMPORTANT)
.Select(n => Unit.Default);
var sizeBuffer =
i
.Buffer(5)
.Select(l => Unit.Default);
return
i
.Window(() => Observable.Merge(timeBuffer, sizeBuffer, flush))
.SelectMany(w => w.ToList())
.Subscribe(o);
}));
query.Subscribe(w => DO_SOMETHING_WITH_PRICES(w));
您需要七(7)次往返服务器才能发送等效的
id;txt
1;alpha
2;bravo
3;charlie
4;delta
5;echo
6;foxtrot
7;golf
你可以通过Table Value Constructor在一次往返中做同样的事情来显着提高速度:
INSERT INTO MySchema.MyTable VALUES (1,'alpha')
INSERT INTO MySchema.MyTable VALUES (2,'bravo')
INSERT INTO MySchema.MyTable VALUES (3,'charlie')
...
INSERT INTO MySchema.MyTable VALUES (7,'golf')
以下代码就是这样做的。当我使用5000行的文件对其进行测试时,使用INSERT INTO MySchema.MyTable VALUES (1,'alpha'),(2,'bravo'),(3,'charlie'), ... ,(7,'golf')
(最大值)运行它比使用rows_per_batch=1000
(相当于您当前的方法)快100倍。
rows_per_batch=1