使用glob读取csv文件以将数据传递到数据库的速度非常慢

2024-09-28 05:20:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有很多csv文件,我正试图将它们包含的所有数据传递到数据库中。出于这个原因,我发现我可以使用glob库来迭代我文件夹中的所有csv文件。以下是我使用的代码:

import requests as req
import pandas as pd
import glob
import json

endpoint = "testEndpoint"
path = "test/*.csv"

for fname in glob.glob(path):
    print(fname)

    df = pd.read_csv(fname)

    for index, row in df.iterrows():
        #print(row['ID'], row['timestamp'], row['date'], row['time'],
        #     row['vltA'], row['curA'], row['pwrA'], row['rpwrA'], row['frq'])

        print(row['timestamp'])

        testjson = {"data":
                        {"installationid": row['ID'],
                         "active": row['pwrA'],
                         "reactive": row['rpwrA'],
                         "current": row['curA'],
                         "voltage": row['vltA'],
                         "frq": row['frq'],
                         }, "timestamp": row['timestamp']}

        payload = {"payload": [testjson]}
        json_data = json.dumps(payload)
        response = req.post(
            endpoint, data=json_data, headers=headers)

这段代码一开始似乎运行良好。然而,过了一段时间,它开始变得非常缓慢(我注意到这一点,因为我在上传数据时打印了时间戳),最终完全停止。这是什么原因?我在这里做的事情真的没有效率吗


Tags: 文件csv数据代码importjsondata原因
1条回答
网友
1楼 · 发布于 2024-09-28 05:20:15

我可以在这里看到3个可能的问题:

  1. 记忆read_csv速度很快,但它会将完整文件的内容加载到内存中。如果文件非常大,您可能会耗尽实际内存并开始使用性能糟糕的swap
  2. iterrows:您似乎构建了一个数据框架——这意味着一个为按列访问而优化的数据结构——然后按行访问它。这已经是一个坏主意,而且iterrows的性能非常糟糕,因为它每行构建一个系列
  3. 每行一个post请求。http请求有其自身的开销,但更进一步,这意味着您一次向数据库添加一行。如果这是数据库的唯一接口,您可能没有其他选择,但您应该搜索是否可以准备一组行并将其作为一个整体加载。它通常提供超过一个数量级的增益

没有更多的信息,我很难说得更多,但IHMO更高的收益是在数据库馈送上,所以在第3点。如果在这一点上什么也做不到,或者如果需要进一步提高性能,我会尝试用csv模块替换熊猫,该模块是面向行的,占用空间有限,因为无论文件大小如何,它一次只处理一行

最后,如果对您的用例有意义,我将尝试使用一个线程来读取csv文件,该文件将提供一个队列和一个线程池来向数据库发送请求。这应该允许获得HTTP开销。但是要注意,根据端点实现的不同,如果数据库访问真的是一个限制因素的话,那么它不会有多大的改进

相关问题 更多 >

    热门问题