![](/img/trans.png)
[英]Reading a dataset of 1M records and copying it to a new csv in Python
[英]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)
試着看一下如何在這個 SO答案中優化SQL插入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.