如何从 SQL 表中下载大数据并通过一次获取 1000 条左右的记录连续保存到 csv 中
Posted
技术标签:
【中文标题】如何从 SQL 表中下载大数据并通过一次获取 1000 条左右的记录连续保存到 csv 中【英文标题】:How to download large data from a SQL table and consecutively save into csv by fetching 1000 or so records at once 【发布时间】:2017-10-27 11:16:32 【问题描述】:我有一个包含 1000 万行和很多列的 SQL 表,查询时的表大小约为 44 GB。
但是,我试图从该表中仅获取 3 列并将其保存到 csv / 加载到 python 一直运行的数据帧中。 即
pd.read_sql("select a,b,c from table") is taking more than 1 hour and not returning data
如何做到这一点?我可以一次将整个数据加载到数据框中是一个可行的选择。 在此之后,我应该能够对这些行执行一些数据操作。 2. 或者我应该将其下载到 csv 并将这些数据部分读取到内存中。
如果是 2。如何为 2 编码?
到目前为止尝试 2 的代码是:
def iter_row(cursor, size=10):
while True:
rows = cursor.fetchmany(size)
if not rows:
break
for row in rows:
yield row
def query_with_fetchmany():
cursor.execute("SELECT * FROM books")
for row in iter_row(cursor, 10):
print(row)
cursor.close()
【问题讨论】:
也许你可以在数据库中做更多的处理,而在数据框中做更少的处理。 数据帧中的 nt 内存操作会比 mysql 快 您是否尝试过仅使用mysql
命令行工具? mysql -Be QUERY
以制表符分隔格式输出结果。
【参考方案1】:
你可以分块读取数据:
for c in pd.read_sql("select a,b,c from table", con=connection, chunksize=10**5):
c.to_csv(r'/path/to/file.csv', index=False, mode='a')
【讨论】:
从我开始这个查询到现在已经10分钟了,python使用的空间已经超过1.2 GB,还是没有在文件夹中写入csv文件?它不应该已经在写这个了吗 @Viv,这很奇怪。尝试减少chunksize
不,我减少到 10^2 并重新运行,现在它再次使用 1.2 gb 并且还没有生成 csv。这里缺少什么?
如果您在运行 Python 脚本的同一台机器/服务器上使用 mysql
客户端执行 select a,b,c from table limit 1000
会发生什么?
哦,这很快。这就是我担心的原因以上是关于如何从 SQL 表中下载大数据并通过一次获取 1000 条左右的记录连续保存到 csv 中的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 SQL 语句从两个特定日期(由用户指定)之间的数据库表中获取数据?