【问题标题】:Working with Big Files with Sql Sever from Python?使用 Python 中的 Sql Server 处理大文件?
【发布时间】:2020-07-04 07:13:40
【问题描述】:

我正在开发一个产品,我必须在 python 中编写脚本来获取大文件(大约 1-1.5 GB)并进行一些处理,最后多次上传到其他表中。我为此编写了一个代码,但我觉得处理我的代码花费了太多时间,我发现当我将文件上传到表中时它大多卡住了,我想优化上传和获取文件的过程来自 DB,我需要你们的帮助。

我创建与数据库连接的函数:

def create_sqlalchemy_engine(server,db,username,passwrd,driver):
try:
    engine = create_engine("mssql+pyodbc://{user}:{pw}@{server}/{db}?driver={drivr}"
                       .format(user=username,
                                server=server,
                               pw=passwrd,
                               db=db,
                               drivr=driver))
except Exception as e:
raise e
return engine

获取文件:

df = pd.read_sql_query('''
          SELECT *
          FROM {}''').format(Table_A)

上传:

df.to_sql(table_name)

【问题讨论】:

  • 不仅提到文件大小(Around 1-1.5 GB),还可以包括它正在获取/读取或写入的行数。

标签: python python-3.x pandas python-2.7


【解决方案1】:
  1. 读取 SQL 查询:使用chunksize 参数加快速度。

如果指定,则返回一个迭代器,其中 chunksize 是要包含在每个块中的行数。

documentation 可用参数:

df = pd.read_sql_query('''
          SELECT *
          FROM {}''', engine, chunksize=1000).format(Table_A)
  1. 写入 SQL:您可以分两步加快写入 SQL 数据库的速度。

    • create_enginelink to the documentation 中设置fast_executemany=True。确保您使用的是 SQLAlchemy 1.3 或更高版本。

    • 将您的 df.to_sql 代码更改为以下内容:

df.to_sql(table_name, con=engine, index=False, if_exists="append", schema="dbo", chunksize=1000)

如果需要,请从上方删除 index=False。这些参数的含义可以在documenation中找到。

【讨论】:

  • file 按文件大小我的意思是说大约 5-8 百万条记录。您建议添加 fast_executemany = True 参数会在编写时加快进程。谢谢
  • 是的,也使用chunksize 参数写入块。让我知道应用上述更改后的结果。
猜你喜欢
  • 1970-01-01
  • 2016-09-02
  • 2012-09-22
  • 2014-07-02
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
  • 2012-03-04
相关资源
最近更新 更多