亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用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 關注
  • 235 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號