如何从 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 语句从两个特定日期(由用户指定)之间的数据库表中获取数据?

如何从 SQL Server 中的表中获取不匹配的数据

如何通过匹配一些冗余字段从 3 个表中获取唯一数据?

如何优化限制查询以更快地从大表中访问数据?

如何编写一个查询以从SQL Server中包含类似名称的多个表中获取数据

SQL Server:如何从只有 ID 的联结表中获取数据?