簡體   English   中英

如何使用python寫出內存csv?

[英]How to write out of memory csv using python?

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

除了使用所有的csv循環外,您還可以使用odo

將csv寫入sql

sqlite示例

以及編寫33GB CSV文件的一個示例


另一個選項是csv2sqlite.py腳本

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM