簡體   English   中英

Python:讀取超過1M的小型csv文件並寫入數據庫

[英]Python: reading over 1M small csv files and writing to a db

我有超過百萬次的快照文件,我需要合並並創建一個文件/數據庫進行分析。

我嘗試在下面的代碼中執行此操作。 首先,我從一個URL列表中讀取一個小的csv,需要幾列,從文本到日期解析日期字段並將其寫入sqlite數據庫。

雖然這段代碼在一小部分文件中運行良好,但迭代超過一百萬個CSV的速度太慢。

我不確定如何提高性能,甚至不確定Python是否適合這項工作。 任何幫助改進此代碼或建議將不勝感激。

import pandas as pd
from sqlalchemy import create_engine
import datetime
import requests
import csv
import io

csv_database2 = create_engine('sqlite:///csv_database_test.db')

col_num = [0,8,9,12,27,31]

with open('url.csv','r') as line_list:
     reader = csv.DictReader(line_list,)

for line in reader:

    data = requests.get(line['URL'])
    df = pd.read_csv(io.StringIO(data.text), usecols=col_num, infer_datetime_format=True)
    df.columns.values[0] = 'DateTime'
    df['ParseDateTime'] = [datetime.datetime.strptime(t, "%a %b %d %H:%M:%S %Y") for t in df.DateTime]
    df.to_sql('LineList', csv_database2, if_exists='append')

恕我直言python非常適合這項任務,通過簡單的修改,您可以實現您想要的性能。

AFAICS可能存在兩個影響性能的瓶頸:

下載網址

你一次下載一個文件,如果下載一個文件需要0.2秒下載1M文件,它將需要> 2天! 我建議您使用concurrent.futures並行下載示例代碼:

from concurrent.futures import ThreadPoolExecutor
import requests


def insert_url(line):
    """download single csv url and insert it to SQLite"""
    data = requests.get(line['URL'])
    df = pd.read_csv(io.StringIO(data.text), usecols=col_num,
                     infer_datetime_format=True)
    df.columns.values[0] = 'DateTime'
    df['ParseDateTime'] = [
        datetime.datetime.strptime(t, "%a %b %d %H:%M:%S %Y") for t in
        df.DateTime]
    df.to_sql('LineList', csv_database2, if_exists='append')


with ThreadPoolExecutor(max_workers=128) as pool:
    pool.map(insert_url, lines)

插入SQL

試着看一下如何在這個 SO答案中優化SQL插入。

進一步指導

  • 我會從並行請求開始,因為它似乎是更大的瓶頸
  • 運行探查器以更好地了解代碼在大多數情況下花費的時間

暫無
暫無

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

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