ira*_*erd 6 python sql-server performance odbc large-data
设置:我在 MS SQL Server 上有一个预处理数据集,大约有 500.000.000 行和 20 列,其中一个是相当长的文本列 (varchar(1300)),相当于 SQL 上大约 35GB 的数据空间数据库。我正在运行 MS SQL Server 的物理机上工作,因此不需要网络流量,并且它有 128GB RAM。MS SQL Server 设置为最多占用 40GB RAM。我想将数据集导入Python以进行进一步处理。假设进行一些深度学习实验,这很重要,因为我需要能够按原样传输文本列。
轶事:为了测试导入代码,我使用了大约 700.000 行的数据集的一个小子样本。运行大约需要 1 分钟,Python 的 RAM 使用量高达 700mb,导入后将变量保存到文件系统的文件大小约为 250mb。据推断,导入完整数据集大约需要 700 分钟,并生成一个 175GB 的文件。这是相当多的,特别是与在 SQL 中复制完整的 31GB 表相比,这最多需要几分钟。我让它运行一天,看看会发生什么,但没有结果。
替代方案:我尝试不使用pandasandsqlalchemy而是pyodbc直接使用,这让我相信问题在于 pyodbc 如何处理数据导入,因为它将查询的数据存储在 rows 对象中,我只能在循环中按行读取,这对我来说似乎效率很低。我不知道是否能以pandas不同sqlalchemy的方式做到这一点。我还尝试不使用单个 select 语句导入完整数据集,而是将其分成许多较小的数据集,这导致小型测试数据集需要 30 分钟而不是 1 分钟来加载。
问题:如何将这个大(但与其他数据库相比不是那么大)的数据集加载到 Python 中?另外,必须有一种方法可以有效地做到这一点?因为它不应该比在 SQL 中复制完整表花费更长的时间,并且它不应该比 SQL 数据库中的表占用更多的空间。我不明白为什么在此过程中数据大小会增加这么多。该解决方案不需要首先将表提取到除 Python 之外的任何其他介质(即没有.csv文件等),尽管使用任何其他 Python 包都可以。
import pyodbc
import pandas as pd
import pandas.io.sql as pdsql
import sqlalchemy
def load_data():
query = "select * from data.table"
engine = sqlalchemy.create_engine('mssql+pyodbc://server/database?driver=SQL+Server+Native+Client+11.0?trusted_connection=yes')
dat = pdsql.read_sql(query, engine)
dat = dat.sort_values(['id', 'date'])
return dat
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1765 次 |
| 最近记录: |