【发布时间】:2015-06-24 17:20:26
【问题描述】:
我有一个包含 155,000 行和 12 列的数据框。 如果我使用 dataframe.to_csv 将其导出到 csv,则输出为 11MB 文件(即刻生成)。
但是,如果我使用 to_sql 方法导出到 Microsoft SQL Server,则需要 5 到 6 分钟! 没有列是文本:只有 int、float、bool 和日期。我见过 ODBC 驱动程序设置 nvarchar(max) 的情况,这会减慢数据传输速度,但这里不是这样。
关于如何加快导出过程有什么建议吗?导出 11 MB 数据需要 6 分钟,这使得 ODBC 连接实际上无法使用。
谢谢!
我的代码是:
import pandas as pd
from sqlalchemy import create_engine, MetaData, Table, select
ServerName = "myserver"
Database = "mydatabase"
TableName = "mytable"
engine = create_engine('mssql+pyodbc://' + ServerName + '/' + Database)
conn = engine.connect()
metadata = MetaData(conn)
my_data_frame.to_sql(TableName,engine)
【问题讨论】:
-
我唯一能想到的就是将结构(即列名和数据类型但没有行)导出到 SQL,然后将文件导出到 CSV 并使用类似导入/导出向导的东西将 CSV 文件附加到 SQL 表。这样我就不必再次定义所有的列类型;这很重要,因为导入工具倾向于读取前 x 行来猜测数据类型,如果第一行都是 NULL,那么猜测将是错误的。然而,事实仍然是 to_sql 方法除了用于小型表之外实际上无法使用。您在其他数据库中也遇到过这种情况吗?
-
我在家里尝试了同样的方法,在我的同一台 PC 上运行 SQL Server Express,python 花了 2 分钟将 100 万行 x 12 列随机数的数据帧传输到 SQL(大小为CSV = 228MB)。不是超级快但可以接受。在连接到几英里外的 SQL 服务器的工作 PC 上花费了 6 分钟(对于一个小得多的文件)。不知道pandas、sqlalchemy或者pyodbc里面有没有参数可以加快传输速度?我经常使用许多其他工具连接到同一个 SQL 服务器,而且速度从来没有那么慢。谢谢!
-
有人吗?我还验证了 pandas.read_sql_table 方法相当快。即使在编写没有约束的表时,也只是编写速度很慢。有任何想法吗?我不可能是唯一一个经历过这种情况的人,但我似乎无法在网上找到任何关于此的文档...... :(
-
也许尝试按块大小分解它?因此,例如,让 for 循环遍历 10,000 行的块 (my_data_frame.to_sql(TableName,engine,chunksize=10000))。
-
或者只是将数据导出到 csv,然后使用批量插入(非常非常快)。您将不得不构建一个格式文件,但这可能是值得的。 link
标签: python sql pandas sqlalchemy pyodbc