gpt4 book ai didi

python - 将 100 个带标题的 CSV 文件合并为一个文件的最快方法是什么?

转载 作者:太空狗 更新时间:2023-10-29 16:58:22 27 4
gpt4 key购买 nike

使用以下设置将 100 个带标题的 CSV 文件合并为一个文件的最快方法是什么:

  1. 文件的总大小为 200 MB。 (尺寸减小,使计算时间可见)
  2. 文件位于最高速度为 240 MB/s 的 SSD 上。
  3. CPU 有 4 个核心,因此多线程和多进程是允许。
  4. 只有一个节点(对Spark很重要)
  5. 可用内存为 15 GB。因此,文件很容易装入内存。
  6. 操作系统是 Linux (Debian Jessie)
  7. 计算机实际上是 Google Cloud 中的 n1-standard-4 实例。

(包含详细设置以使问题的范围更加具体。更改是根据 the feedback here 进行的)

文件 1.csv:

a,b
1,2

文件 2.csv:

a,b
3,4

最终输出.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

工具版本:

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 笔记本中的代码:

种子:

%%time
!head temp/in/1.csv > temp/merged_sed.csv
!sed 1d temp/in/*.csv >> temp/merged_sed.csv

纯 Python 所有二进制读写,具有“下一步”的未记录行为:

%%time
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())

错误:

%%time
!awk 'NR==1; FNR==1{{next}} 1' temp/in/*.csv > temp/merged_awk.csv

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)

R data.table with colClasses:

%%time
%%R
filenames <- paste0("temp/in/",list.files(path="temp/in/",pattern="*.csv"))
files <- lapply(filenames, fread,colClasses=c(
V1="integer",
V2="integer",
V3="integer",
V4="integer",
V5="integer",
V6="integer",
V7="integer",
V8="integer",
V9="integer",
V10="integer"))
merged_data <- rbindlist(files, use.names=F)
fwrite(merged_data, file="temp/merged_R_fwrite.csv", row.names=FALSE)

Spark (pyspark):

%%time
df = spark.read.format("csv").option("header", "true").load("temp/in/*.csv")
df.coalesce(1).write.option("header", "true").csv("temp/merged_pyspark.csv")

Python Pandas :

%%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)
}

最佳答案

根据问题中的基准,最快的方法是纯 Python,带有二进制文件的未记录的“next()”函数行为。该方法由 Stefan Pochmann 提出

基准:

基准(根据评论和帖子中的方法更新):

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

纯 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())

关于python - 将 100 个带标题的 CSV 文件合并为一个文件的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44211461/

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