Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将100个带有标题的CSV文件合并为一个文件的最快方法是什么?_Python_R_Csv - Fatal编程技术网

Python 将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实例 (包括了详细的设置,以使问题的范围更加具体。更

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

  • 文件的总大小为200 MB。(缩小尺寸以使 计算时间(可视)
  • 这些文件位于SSD上,最高速度为240 MB/s
  • CPU有4个内核,因此可以使用多线程和多进程 允许
  • 仅存在一个节点(对于Spark很重要)
  • 可用内存为15 GB。因此,这些文件很容易放入内存
  • 操作系统是Linux(Debian Jessie)
  • 这台计算机实际上是Google云中的n1-standard-4实例
  • (包括了详细的设置,以使问题的范围更加具体。更改是根据

    文件1.csv:

    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
    并填充新的字符串列表。