为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用python写出内存不足的csv?

如何使用python写出内存不足的csv?

慕妹3146593 2021-12-21 11:04:09
我需要将 sql 查询的结果输出到 csv。查询结果将超出我的内存资源。此外,熊猫中的 csv 操作通常比使用 csv 库要慢得多,所以我不想使用熊猫。我试图创建下面的代码,目的是批量处理 1000 行的列表,然后将它们附加到 csv 文件的内容中。当我运行它时,我的系统内存不足,它不像我预期的那样工作。我不确定我做错了什么,或者是否有我不明白的地方。ROWS_AT_ONCE = 1000curr.execute('''SELECT*FROM '''+Table_Name+''';''')rows = curr.fetchall()headers = list(map(lambda x: x[0], curr.description))headers = tuple(headers)csv_w_pointer = open(Export_Path_Name, 'a' , newline='')csv_writer = csv.writer(csv_w_pointer, delimiter='\t', quotechar='"')csv_writer.writerow(headers)batch = list()for row in rows:    batch.append(row)    if len(batch) >= ROWS_AT_ONCE:        csv_writer.writerow(batch)    batch = list()if batch:    csv_writer.writerow(batch)del batch当内存不足时,我需要将 sql 结果写入 csv。由于内存不足,我当前的尝试失败了。
查看完整描述

2 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

fetchall如果您的数据集很大,则应避免使用该方法。fetchmany改为使用该方法一次仅获取一定数量的行,并将获取的行立即写入 CSV 以最大限度地减少内存使用:


ROWS_AT_ONCE = 1000


curr.execute(

'''

SELECT

*

FROM '''+Table_Name+'''


;

'''

)

headers = list(map(lambda x: x[0], curr.description))

headers = tuple(headers)

with open(Export_Path_Name, 'a' , newline='') as csv_w_pointer:

    csv_writer = csv.writer(csv_w_pointer, delimiter='\t', quotechar='"')

    csv_writer.writerow(headers)

    while True:

        rows = curr.fetchmany(ROWS_AT_ONCE)

        if not rows:

            break

        csv_writer.writerows(rows)


查看完整回答
反对 回复 2021-12-21
?
慕森王

TA贡献1777条经验 获得超3个赞

您可以使用库odo,而不是所有的 csv 循环

将 csv 写入 sql

SQLite 示例

以及一个编写 33gb csv 文件的示例


另一种选择是csv2sqlite.py脚本


查看完整回答
反对 回复 2021-12-21
  • 2 回答
  • 0 关注
  • 236 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号