我可以加快在 python 中读取和处理许多.csv文件的速度吗?



我目前忙于一个由90个.csv文件组成的数据集。有三种类型的.csv文件(每种类型30个(。

每个csv平均有20k到30k行和3列(linux格式的时间戳,整数,整数(。

下面是标题和行的示例:

Timestamp   id1    id2
151341342   324    112

我目前正在使用"os"列出目录中的所有文件。

每个 CSV 文件的过程如下:

  1. 通过熊猫将其读取到数据帧中
  2. 迭代文件的行,并为每一行将时间戳转换为可读格式。
  3. 使用转换后的时间戳和整数创建对象的关系类型,并将其添加到关系列表中

该列表稍后将循环以在我的 neo4j 数据库中创建关系。 我遇到的问题是这个过程需要太多时间。我已经询问并寻找了更快完成它的方法(我得到了像 PySpark、Threads 这样的答案(,但我没有找到真正适合我需求的东西。我真的很困,因为我的资源大约需要 1 小时 20 分钟才能完成其中一个大.csv文件(意味着一个大约 30k 行的文件(的所有过程
转换为可读格式:

ts = int(row['Timestamp'])
formatted_ts = datetime.utcfromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')

我将参数传递给py2neo的关系函数来创建我的关系。稍后该列表将循环 .

node1 = graph.evaluate('MATCH (n:User) WHERE n.id={id} RETURN n', id=int(row["id1"]))
node2 = graph.evaluate('MATCH (n:User) WHERE n.id={id} RETURN n', id=int(row['id2']))
rels.append(Relationship(node1, rel_type, node2, date=date, time=time))

time to compute row:  0:00:00.001000
time to create relationship:  0:00:00.169622
time to compute row:  0:00:00.001002
time to create relationship:  0:00:00.166384
time to compute row:  0:00:00
time to create relationship:  0:00:00.173672
time to compute row:  0:00:00
time to create relationship:  0:00:00.171142

我计算了该过程的两个部分的时间,如上所示。它很快,除了文件的大小之外,似乎真的没有问题。这就是为什么唯一想到的是并行性将有助于更快地计算这些文件(通过计算,让我们在同一时间而不是一个文件(

抱歉没有发布所有内容

我真的很期待回复

提前谢谢你

这对我来说听起来很可疑。处理这种大小的 csv 文件不应该那么慢。

我刚刚生成了一个您描述的类型的 30k 行 csv 文件(3 列填充了您指定大小的随机数。

import random
with open("file.csv", "w") as fid:
fid.write("Timestamp;id1;id2n")
for i in range(30000):
ts = int(random.random()*1000000000)
id1 = int(random.random()*1000)
id2 = int(random.random()*1000)
fid.write("{};{};{}n".format(ts, id1, id2))

只需使用普通 Python 将 csv 文件读入列表就需要不到一秒钟的时间。打印所有数据大约需要 3 秒。

from datetime import datetime
def convert_date(string):
ts = int(string) 
formatted_ts = datetime.utcfromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S') 
split_ts = formatted_ts.split() 
date = split_ts[0] 
time = split_ts[1]
return date
with open("file.csv", "r") as fid:
header = fid.readline()
lines = []
for line in fid.readlines():
line_split = line.strip().split(";")
line_split[0] = convert_date(line_split[0])
lines.append(line_split)
for line in lines:
print(line)

你能详细说明你在阅读数据后做了什么吗?特别是"创建对象的关系类型并将其添加到关系列表中">

这可能有助于查明您的时间问题。也许某处有错误? 您可以尝试对代码的不同部分进行计时,看看哪一部分花费的时间最长。

一般来说,你所描述的内容应该在几秒钟内实现,而不是几小时。

最新更新