CSV 到 SQL 服务器:批量导入噩梦 (T-SQL and/or Pandas)
CSV to SQL Server: bulk import nightmare (T-SQL and/or Pandas)
我正在尝试将 .CSV
文件批量插入 SQL 服务器,但没有成功。
一些背景知识:
1. 我需要将 1600 万条记录插入到 SQL 服务器 (2017) 数据库中。每条记录有 130 列。我在 .CSV
中有一个字段来自我们的一个供应商的 API 呼叫,我不允许提及。我有整数、浮点数和字符串数据类型。
2. 我尝试了通常的方法:BULK INSERT
但我无法通过数据类型错误。我发布了一个问题 here 但无法解决问题。
3. 我尝试使用 python 进行试验并尝试了我能找到的所有方法,但是 pandas.to_sql
每个人都警告它非常慢。我遇到了数据类型和字符串截断错误。不同于 BULK INSERT
.
4. 没有太多选择我尝试了 pd.to_sql
虽然它没有引发任何数据类型或截断错误但由于 运行 out space 在我的 tmp SQL 数据库中。尽管我有很多 space 并且我的所有数据文件(和日志文件)都设置为无限制自动增长,但我也无法通过此错误。
我当时卡住了。我的代码(pd.to_sql
部分)很简单:
import pandas as pd
from sqlalchemy import create_engine
engine = create_engine("mssql+pyodbc://@myDSN")
df.to_sql('myTable', engine, schema='dbo', if_exists='append',index=False,chunksize=100)
我不太确定还能尝试什么,欢迎提出任何建议。我见过的所有代码和示例都处理小数据集(列数不多)。我愿意尝试任何其他方法。我将不胜感激。
谢谢!
我只是想分享这段肮脏的代码,以防它能帮助到其他人。请注意,我非常清楚这根本不是最佳选择,速度很慢,但我能够在十分钟内插入大约 1600 万条记录而不会使我的机器过载。
我试过小批量使用:
import pandas as pd
from sqlalchemy import create_engine
engine = create_engine("mssql+pyodbc://@myDSN")
a = 1
b = 1001
while b <= len(df):
try:
df[a:b].to_sql('myTable', engine, schema='dbo', if_exists='append',index=False,chunksize=100)
a = b + 1
b = b + 1000
except:
print(f'Error between {a} and {b}')
continue
丑陋至极但对我有用。
我愿意接受所有的批评和建议。正如我所提到的,我发布这个以防它对其他人有帮助,但也期待收到一些建设性的反馈。
将数据从 pandas 数据帧加载到 SQL 数据库非常慢,在处理大型数据集时,运行 内存不足是常见的情况。在处理大型数据集时,您需要比这更高效的东西。
d6tstack 可能会解决您的问题。因为它适用于本机数据库导入命令。它是一个专门为处理模式以及性能问题而构建的自定义库。适用于可导出为 CSV、Parquet、SQL 和 Pandas.
的 XLS、CSV、TXT
我觉得df.to_sql
非常棒!我最近一直在使用它。当数据集非常庞大时,它有点慢。如果您需要速度,我认为批量插入将是最快的选择。您甚至可以分批完成这项工作,这样您就不会 运行 内存不足,并且可能会使您的机器不堪重负。
BEGIN TRANSACTION
BEGIN TRY
BULK INSERT OurTable
FROM 'c:\OurTable.txt'
WITH (CODEPAGE = 'RAW', DATAFILETYPE = 'char', FIELDTERMINATOR = '\t',
ROWS_PER_BATCH = 10000, TABLOCK)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH
我正在尝试将 .CSV
文件批量插入 SQL 服务器,但没有成功。
一些背景知识:
1. 我需要将 1600 万条记录插入到 SQL 服务器 (2017) 数据库中。每条记录有 130 列。我在 .CSV
中有一个字段来自我们的一个供应商的 API 呼叫,我不允许提及。我有整数、浮点数和字符串数据类型。
2. 我尝试了通常的方法:BULK INSERT
但我无法通过数据类型错误。我发布了一个问题 here 但无法解决问题。
3. 我尝试使用 python 进行试验并尝试了我能找到的所有方法,但是 pandas.to_sql
每个人都警告它非常慢。我遇到了数据类型和字符串截断错误。不同于 BULK INSERT
.
4. 没有太多选择我尝试了 pd.to_sql
虽然它没有引发任何数据类型或截断错误但由于 运行 out space 在我的 tmp SQL 数据库中。尽管我有很多 space 并且我的所有数据文件(和日志文件)都设置为无限制自动增长,但我也无法通过此错误。
我当时卡住了。我的代码(pd.to_sql
部分)很简单:
import pandas as pd
from sqlalchemy import create_engine
engine = create_engine("mssql+pyodbc://@myDSN")
df.to_sql('myTable', engine, schema='dbo', if_exists='append',index=False,chunksize=100)
我不太确定还能尝试什么,欢迎提出任何建议。我见过的所有代码和示例都处理小数据集(列数不多)。我愿意尝试任何其他方法。我将不胜感激。
谢谢!
我只是想分享这段肮脏的代码,以防它能帮助到其他人。请注意,我非常清楚这根本不是最佳选择,速度很慢,但我能够在十分钟内插入大约 1600 万条记录而不会使我的机器过载。
我试过小批量使用:
import pandas as pd
from sqlalchemy import create_engine
engine = create_engine("mssql+pyodbc://@myDSN")
a = 1
b = 1001
while b <= len(df):
try:
df[a:b].to_sql('myTable', engine, schema='dbo', if_exists='append',index=False,chunksize=100)
a = b + 1
b = b + 1000
except:
print(f'Error between {a} and {b}')
continue
丑陋至极但对我有用。
我愿意接受所有的批评和建议。正如我所提到的,我发布这个以防它对其他人有帮助,但也期待收到一些建设性的反馈。
将数据从 pandas 数据帧加载到 SQL 数据库非常慢,在处理大型数据集时,运行 内存不足是常见的情况。在处理大型数据集时,您需要比这更高效的东西。
d6tstack 可能会解决您的问题。因为它适用于本机数据库导入命令。它是一个专门为处理模式以及性能问题而构建的自定义库。适用于可导出为 CSV、Parquet、SQL 和 Pandas.
的 XLS、CSV、TXT我觉得df.to_sql
非常棒!我最近一直在使用它。当数据集非常庞大时,它有点慢。如果您需要速度,我认为批量插入将是最快的选择。您甚至可以分批完成这项工作,这样您就不会 运行 内存不足,并且可能会使您的机器不堪重负。
BEGIN TRANSACTION
BEGIN TRY
BULK INSERT OurTable
FROM 'c:\OurTable.txt'
WITH (CODEPAGE = 'RAW', DATAFILETYPE = 'char', FIELDTERMINATOR = '\t',
ROWS_PER_BATCH = 10000, TABLOCK)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH