猿问

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

我需要将 sql 查询的结果输出到 csv。查询结果将超出我的内存资源。此外,熊猫中的 csv 操作通常比使用 csv 库要慢得多,所以我不想使用熊猫。


我试图创建下面的代码,目的是批量处理 1000 行的列表,然后将它们附加到 csv 文件的内容中。当我运行它时,我的系统内存不足,它不像我预期的那样工作。


我不确定我做错了什么,或者是否有我不明白的地方。


ROWS_AT_ONCE = 1000


curr.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。由于内存不足,我当前的尝试失败了。


慕妹3146593
浏览 237回答 2
2回答

翻过高山走不出你

fetchall如果您的数据集很大,则应避免使用该方法。fetchmany改为使用该方法一次仅获取一定数量的行,并将获取的行立即写入 CSV 以最大限度地减少内存使用:ROWS_AT_ONCE = 1000curr.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)

慕森王

您可以使用库odo,而不是所有的 csv 循环将 csv 写入 sqlSQLite 示例以及一个编写 33gb csv 文件的示例另一种选择是csv2sqlite.py脚本
随时随地看视频慕课网APP

相关分类

Python
我要回答