gpt4 book ai didi

Python:读取超过 1M 的小型 csv 文件并写入数据库

转载 作者:行者123 更新时间:2023-11-28 18:14:54 25 4
gpt4 key购买 nike

我有超过一百万次的快照文件需要合并并创建一个文件/数据库进行分析。

我尝试在下面的代码中执行此操作。首先,我从 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

尝试查看如何优化 SQL 插入 this所以回答。

进一步指导

  • 我会从并行请求开始,因为它似乎是更大的瓶颈
  • 运行探查器以更好地了解您的代码大部分时间花在哪里

关于Python:读取超过 1M 的小型 csv 文件并写入数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48977607/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com