加速从CSV文件插入到SQL Server而不使用BULK INSERT或pandas to_sql

时间:2017-10-11 09:15:27

标签: python sql-server pandas pyodbc

我想将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()

如上所述,上面的代码正在运行,但速度很慢...... 我该怎么做才能加快速度?

1 个答案:

答案 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