我有很多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)
这段代码一开始似乎运行良好。然而,过了一段时间,它开始变得非常缓慢(我注意到这一点,因为我在上传数据时打印了时间戳),最终完全停止。这是什么原因?我在这里做的事情真的没有效率吗
我可以在这里看到3个可能的问题:
read_csv
速度很快,但它会将完整文件的内容加载到内存中。如果文件非常大,您可能会耗尽实际内存并开始使用性能糟糕的swapiterrows
:您似乎构建了一个数据框架——这意味着一个为按列访问而优化的数据结构——然后按行访问它。这已经是一个坏主意,而且iterrows
的性能非常糟糕,因为它每行构建一个系列没有更多的信息,我很难说得更多,但IHMO更高的收益是在数据库馈送上,所以在第3点。如果在这一点上什么也做不到,或者如果需要进一步提高性能,我会尝试用csv模块替换熊猫,该模块是面向行的,占用空间有限,因为无论文件大小如何,它一次只处理一行
最后,如果对您的用例有意义,我将尝试使用一个线程来读取csv文件,该文件将提供一个队列和一个线程池来向数据库发送请求。这应该允许获得HTTP开销。但是要注意,根据端点实现的不同,如果数据库访问真的是一个限制因素的话,那么它不会有多大的改进
相关问题 更多 >
编程相关推荐