gpt4 book ai didi

Python Pandas - 加速 csv join

转载 作者:太空宇宙 更新时间:2023-11-04 02:06:03 26 4
gpt4 key购买 nike

我有一个优化问题。我需要在一个独特的 csv 中加入一些 csv(都具有相同的结构)。

我的文件夹结构遵循时间顺序:年/月/日/小时_文件_标识符.csv。因此 16y*365d*24h = 140160 个文件。这是我可以拥有的最大文件数。每个按天索引的文件夹都可以有任意数量的文件(我也是用 python 脚本生成的)。由于文件数量将超过 ext4 文件系统每 N 次迭代允许的最大数量,因此我需要将所有文件加入 hour_indexed 文件中,以免遇到此问题。

因此,我称之为join_routine 的输入是按时间索引的文件夹,例如:

2001/9/3/
2002/8/4/

这些文件夹中的每一个都可以包含可变数量的文件:

2001/9/3/
1-01.csv
1-02.csv
2-01.csv
2002/8/4/
1-01.csv
2-01.csv
3-01.csv
3-01.csv

join_routine 的结果应该是:

2001/9/3/
1-joined.csv
2-joined.csv
2002/8/4/
1-joined.csv
2-joined.csv
3-joined.csv

为此,我开发了以下代码:

def join_routine():
# print('JOIN ROUTINE')
directory_list = [x.replace('\\','/') for x in glob.glob('data/csv/plays/*/*/*/')]

for directory in directory_list:
for hour in range(0,13):
file_list = [x.replace('\\','/') for x in glob.glob(directory+ str(hour) +'-*.csv')]
if len(file_list) > 0:
df = read_csv_list(file_list)
df.to_csv(directory+str(hour)+'-joined.csv', index = False)
for file in [ x for x in file_list if x not in directory+str(hour)+'-joined.csv']:
os.remove(file)

def read_csv_list(file_list):
df_list = []
# with progressbar.ProgressBar(max_value=len(file_list)) as bar:
# i = 0
for file in file_list:
df = pd.read_csv(file)
df_list.append(df)
# i = i + 1
# bar.update(i)

return pd.concat(df_list, axis = 0, ignore_index = True)

join_routine 函数在单个进程中处理每个文件夹的连接。我想知道是否有更好、更重要、更快的方法来做到这一点。 join_routine 占用了超过 10 倍的文件创建时间(这是在 16 名工作人员的并行进程池上完成的)。我需要执行 join_routine 21 次,按照这个速度要花 1 个多星期,这是不可行的。有什么想法吗?

最佳答案

只是不要使用 Pandas !

实验 1:读取文件并逐行追加到另一行(代码取自 how to merge 200 csv files in Python ):

import time

#%%
start1 = time.time()
fout=open("out.csv","a")
# first file:
for line in open("file.csv"):
fout.write(line)
# now the rest:
for num in range(2,201):
f = open("file.csv")
f.__next__() # skip the header
for line in f:
fout.write(line)
f.close() # not really needed
fout.close()
end1 = time.time()
print(end1-start1) #0.3000311851501465

实验二(使用pandas读写csv文件):

import time
import pandas as pd
start2 = time.time()
df_list = []
for i in range(200):
df = pd.read_csv('file.csv')
df_list.append(df)
df = pd.concat(df_list, axis = 0, ignore_index = True)
df.to_csv('out2.csv', index = False)
end2 = time.time()
print(end2-start2) #3.0119707584381104

关于Python Pandas - 加速 csv join,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54704440/

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