我需要將 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)

慕森王
TA貢獻1777條經驗 獲得超3個贊
添加回答
舉報
0/150
提交
取消