【问题标题】:Can I speed up my reading and processing of many .csv files in python?我可以加快我在 python 中读取和处理许多 .csv 文件的速度吗?
【发布时间】:2019-11-23 21:54:36
【问题描述】:

我目前正在处理一个由 90 个.csv 文件组成的数据集。 .csv 文件共有三种类型(每种类型 30 个)。

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

以下是标题和行的示例:

Timestamp   id1    id2
151341342   324    112

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

每个CSV文件的处理过程如下:

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

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

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

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

抱歉没有发布所有内容

我真的很期待回复

提前谢谢你

【问题讨论】:

  • 能否在您的问题中包含您当前代码的 sn-p?
  • 尝试查看dask dataframes。您可以将所有 csv 文件延迟加载到单个数据帧中并独立操作。
  • 好的,这样更好,但我仍然看不到您的减速发生在哪里。正如我在下面建立的,读取 csv 文件应该非常快。您表明将输入转换为可读格式很快。转变为人际关系需要一点时间,但还不到一个小时。你能具体说明哪个部分需要这么长时间吗?一般来说,如果您提供所有重要信息,我们将能够更好地帮助您。设身处地为我们着想:根据您的问题考虑我们所知道的和我们不知道的。目前你留下了很多空缺,这让我们在黑暗中钓鱼。
  • 很抱歉,我对将 stackoverflow 用于个人项目还是很陌生。它与仅用于搜索可能在几年前就已回答的特定问题确实有很大不同。

标签: python pandas multithreading csv pyspark


【解决方案1】:

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

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

import random

with open("file.csv", "w") as fid:
    fid.write("Timestamp;id1;id2\n")
    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)

您能否详细说明您在阅读数据后会做什么?特别是“创建关系类型的对象并将其添加到关系列表中”

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

通常,您所描述的内容应该在几秒钟内而不是几小时内完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-30
    • 2018-06-06
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 2011-01-17
    相关资源
    最近更新 更多