CSV到SQL Server:批量导入噩梦(T-SQL和/或Pandas)

我试图将from itertools import groupby def solution(vector): n = 0 for group in groupby(vector): n += 1 return n // 2 + 1 if n > 1 else n 文件批量插入SQL Server中,但收效甚微。

一些背景:

1。。我需要在SQL Server(2017)数据库中插入1600万条记录。每条记录有130列。我在.CSV中有一个字段,该字段来自我们其中一位供应商的API调用,我不允许提及。我有整数,浮点数和字符串数据类型。

2。。我尝试了常规操作:.CSV,但无法传递数据类型错误。我发布了一个问题here,但无法解决该问题。

3。。我尝试使用python进行实验,并尝试了所有可以找到的方法,但BULK INSERT的所有人都警告说它非常慢。我陷入了数据类型和字符串截断错误。与pandas.to_sql不同。

4。。由于没有太多选择,我尝试了BULK INSERT,尽管它没有引发任何数据类型或截断错误,但由于tmp SQL数据库空间不足而失败了。尽管我有足够的空间并且我所有的数据文件(和日志文件)都设置为无限制自动增长,但我也无法通过此错误。

那时我陷入困境。我的代码(用于pd.to_sql段)很简单:

pd.to_sql

我不太确定还有什么尝试,欢迎提出任何建议。我看到的所有代码和示例都涉及较小的数据集(列不多)。我愿意尝试任何其他方法。任何指针,我将不胜感激。

谢谢!

zkx993299184 回答:CSV到SQL Server:批量导入噩梦(T-SQL和/或Pandas)

我只是想分享这段肮脏的代码,以防万一它对其他人有帮助。请注意,我知道这根本不是最佳选择,它很慢,但是我能够在10分钟内插入大约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

丑陋,但为我工作。

我欢迎所有批评家和建议。正如我提到的,我发布此消息是为了对其他人有所帮助,但也希望能收到一些建设性的反馈意见。

,

将数据从熊猫数据框加载到SQL数据库非常慢,并且在处理大型数据集时,通常会出现内存不足的情况。您需要比处理大型数据集更有效的方法。

d6tstack可能会解决您的问题。因为它与本机数据库导入命令一起使用。这是一个自定义库,专门用于处理架构以及性能问题。适用于XLS,CSV,TXT,可以导出为CSV,Parquet,SQL和Pandas。

,

我认为 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 
本文链接:https://www.f2er.com/1375662.html

大家都在问