Python 将100个带有标题的CSV文件合并为一个文件的最快方法是什么?
通过以下设置,将100个带有标题的CSV文件合并为一个文件的最快方法是什么:Python 将100个带有标题的CSV文件合并为一个文件的最快方法是什么?,python,r,csv,Python,R,Csv,通过以下设置,将100个带有标题的CSV文件合并为一个文件的最快方法是什么: 文件的总大小为200 MB。(缩小尺寸以使 计算时间(可视) 这些文件位于SSD上,最高速度为240 MB/s CPU有4个内核,因此可以使用多线程和多进程 允许 仅存在一个节点(对于Spark很重要) 可用内存为15 GB。因此,这些文件很容易放入内存 操作系统是Linux(Debian Jessie) 这台计算机实际上是Google云中的n1-standard-4实例 (包括了详细的设置,以使问题的范围更加具体。更
a,b
1,2
文件2.csv:
a,b
3,4
Final out.csv:
a,b
1,2
3,4
根据我的基准测试,所有提出的方法中最快的是纯python。有没有更快的方法
基准(使用评论和帖子中的方法更新):
Method Time
pure python 0.298s
sed 1.9s
awk 2.5s
R data.table 4.4s
R data.table with colClasses 4.4s
Spark 2 40.2s
python pandas 1min 11.0s
Method Time
pure python 0.298s
sed 1.9s
awk 2.5s
R data.table 4.4s
R data.table with colClasses 4.4s
Spark 2 40.2s
python pandas 1min 11.0s
工具版本:
sed 4.2.2
awk: mawk 1.3.3 Nov 1996
Python 3.6.1
Pandas 0.20.1
R 3.4.0
data.table 1.10.4
Spark 2.1.1
sed 4.2.2
awk: mawk 1.3.3 Nov 1996
Python 3.6.1
Pandas 0.20.1
R 3.4.0
data.table 1.10.4
Spark 2.1.1
Jupyter笔记本中的代码:
Method Time
pure python 0.298s
sed 1.9s
awk 2.5s
R data.table 4.4s
R data.table with colClasses 4.4s
Spark 2 40.2s
python pandas 1min 11.0s
Method Time
pure python 0.298s
sed 1.9s
awk 2.5s
R data.table 4.4s
R data.table with colClasses 4.4s
Spark 2 40.2s
python pandas 1min 11.0s
sed:
纯Python全二进制读写,未记录的行为为“下一步”:
awk:
R数据表:
%%time
%%R
filenames <- paste0("temp/in/",list.files(path="temp/in/",pattern="*.csv"))
files <- lapply(filenames, fread)
merged_data <- rbindlist(files, use.names=F)
fwrite(merged_data, file="temp/merged_R_fwrite.csv", row.names=FALSE)
蟒蛇熊猫:
%%time
import pandas as pd
interesting_files = glob.glob("temp/in/*.csv")
df_list = []
for filename in sorted(interesting_files):
df_list.append(pd.read_csv(filename))
full_df = pd.concat(df_list)
full_df.to_csv("temp/merged_pandas.csv", index=False)
数据由以下机构生成:
%%R
df=data.table(replicate(10,sample(0:9,100000,rep=TRUE)))
for (i in 1:100){
write.csv(df,paste0("temp/in/",i,".csv"), row.names=FALSE)
}
sed
可能是最快的。我还将提出一个awk
备选方案
awk 'NR==1; FNR==1{next} 1' file* > output
打印第一个文件的第一行,然后跳过其余文件的所有其他第一行
时间:
我尝试了10000行长的100个文件,每个大约200MB(不确定)。这是我的服务器上最糟糕的时间
real 0m0.429s
user 0m0.360s
sys 0m0.068s
服务器规格(小怪物)
根据问题中的基准测试,最快的方法是纯Python,带有二进制文件的未记录的“next()”函数行为。该方法由 基准: 基准(使用评论和帖子中的方法更新):
Method Time
pure python 0.298s
sed 1.9s
awk 2.5s
R data.table 4.4s
R data.table with colClasses 4.4s
Spark 2 40.2s
python pandas 1min 11.0s
Method Time
pure python 0.298s
sed 1.9s
awk 2.5s
R data.table 4.4s
R data.table with colClasses 4.4s
Spark 2 40.2s
python pandas 1min 11.0s
工具版本:
sed 4.2.2
awk: mawk 1.3.3 Nov 1996
Python 3.6.1
Pandas 0.20.1
R 3.4.0
data.table 1.10.4
Spark 2.1.1
sed 4.2.2
awk: mawk 1.3.3 Nov 1996
Python 3.6.1
Pandas 0.20.1
R 3.4.0
data.table 1.10.4
Spark 2.1.1
纯Python代码:
with open("temp/merged_pure_python2.csv","wb") as fout:
# first file:
with open("temp/in/1.csv", "rb") as f:
fout.write(f.read())
# now the rest:
for num in range(2,101):
with open("temp/in/"+str(num)+".csv", "rb") as f:
next(f) # skip the header
fout.write(f.read())
文件有多大?您使用的是Python2还是Python3?尝试
fout.write(f.read())
而不是循环,并尝试将文件作为二进制文件打开(使用“wb”
进行写入,“rb”
进行读取)。这需要多长时间?我不确定它是否会与Spark有显著的不同,但Apache Drill(甚至在本地运行)在这方面真的很擅长。@MarkSetchell根据我的基准测试,差异很大,不受I/O限制。目前Python的性能是sed的10倍。如果你是对的,它应该是一样的。@keiv.fly和你现在的一样。如果你愿意,可以自己发布答案。sed
甚至不是他们测试中最快的。您是在谈论另一种使用sed
的方式吗?不,抱歉,没有看到计时。令人惊喜的是Python速度更快。我的猜测是awk
将击败它。希望他们将您的解决方案包括在基准测试中。但是Python应该比现在更快,因为目前有解码加编码,据我所知没有任何原因,而不仅仅是原始的读写。你的服务器可以在不到0.5秒内读写和处理20GB?那是什么怪物?看起来不像怪物。我不认为你的每个文件都接近200MB。或者别的什么地方出了问题。顺便说一句,OPs文件总共有200MB(我刚刚运行了它们的创建代码,每个文件有2MB,100000行,每个20字节)。纯python解决方案(非常好的Btw!)给了我以下错误:ValueError:混合迭代和读取方法会丢失数据。我通过跳过next(f)
并使用fout.write(“.”join(f.readlines()[1:])
@Gombo解决了这个问题。您使用什么版本的Python?一周前,我在Python3.7中使用了这段代码,它没有出现错误。使用readlines会减慢执行速度,因为python需要查找\n
并填充新的字符串列表。