我需要将sql查询的结果输出到csv。查询结果将超出我的内存资源。此外csv操作在熊猫中通常比我使用csv库慢得多,所以我不想使用pandas。
我试图创建下面的代码,意图批处理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。由于超出记忆,我目前的尝试失败了。
如果数据集很大,则应避免使用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)