【问题标题】:efficient way to join 65,000 .csv files加入 65,000 个 .csv 文件的有效方法
【发布时间】:2021-10-13 04:01:39
【问题描述】:

我说需要使用 julia 语言处理 65,000 个 .csv 文件。

目标是对数据集进行基本统计。

我有一些方法可以连接所有数据集

#1 - set a common index and leftjoin() - perform statistics row wise 
#2 - vcat() the dataframes on top of each other - vertically stacked use group by

无论如何,最终的数据帧都非常大!处理速度变慢

有没有一种有效的方法?

我想过执行 #1 或 #2 并将连接操作分成三份,假设在 20,000 次连接后保存到 .csv 并分块操作,然后在最后一次操作中加入所有 3 个操作。

不知道如何复制制作 65k .csv 文件,但基本上在下面我循环浏览目录中的文件,加载 csv 然后将 vcat() 加载到一个 df。更多关于是否有更好的方法来管理操作规模的问题。 vcat() 使某些东西成长。提前也许我可以循环浏览 .csv 文件,获取每个 .csv 的文件尺寸,将完整数据帧初始化为最终输出大小,然后逐行循环遍历每个 .csv 并填充初始化的 df。

using CSV
using DataFrames

# read all files in directory
csv_dir_tmax = cd(readdir, "C:/Users/andrew.bannerman/Desktop/Julia/scripts/GHCN data/ghcnd_all_csv/tmax")

# initialize outputs
tmax_all = DataFrame(Date = [], TMAX = [])
c=1
for c = 1:length(csv_dir_tmax)
    print("Starting csv file ", csv_dir_tmax[c]," - Iteration ",c,"\n")
        if c <= length(csv_dir_tmax)
    csv_tmax = CSV.read(join(["C:/Users/andrew.bannerman/Desktop/Julia/scripts/GHCN data/ghcnd_all_csv/tmax/", csv_dir_tmax[c]]), DataFrame, header=true)
        tmax_all = vcat(tmax_all, csv_tmax)
    end
end

【问题讨论】:

  • 如果您想获得可靠的建议,请分享您现在使用的代码,然后可以对其进行调查。一般来说,从您的描述看来,您执行的聚合可以按文件方式完成,那么您为什么要以其他方式执行它。一般来说,我的假设是性能瓶颈将是 IO 而不是数据处理。
  • 高层次的想法是多线程加载和vcat,然后适当地聚合它,但是对于这样的普遍问题很难提供好的建议。

标签: dataframe csv julia


【解决方案1】:

以下方法应该是相对有效的(假设数据适合内存):

tmax_all = reduce(vcat, [CSV.read("YOUR_DIR$x", DataFrame) for x in csv_dir_tmax])

【讨论】:

【解决方案2】:

将最终输出初始化为最终输出的总大小(就像最终构建的 vcat() 一样)。然后按元素填充它似乎效果更好:

# get the dimensions of each .csv files
tmax_all_total_output_size = fill(0, size(csv_dir_tmax,1))
tmin_all_total_output_size = fill(0, size(csv_dir_tmin,1))
tavg_all_total_output_size = fill(0, size(csv_dir_tavg,1))
tmax_dim = Int64[]
tmin_dim = Int64[]
tavg_dim = Int64[]
c=1
for c = 1:length(csv_dir_tmin) # 47484 - last point
    print("Starting csv file ", csv_dir_tmin[c]," - Iteration ",c,"\n")
        if c <= length(csv_dir_tmax)
    tmax_csv = CSV.read(join(["C:/Users/andrew.bannerman/Desktop/Julia/scripts/GHCN data/ghcnd_all_csv/tmax/", csv_dir_tmax[c] ]), DataFrame, header=true)
    global tmax_dim = size(tmax_csv,1)
        tmax_all_total_output_size[c] = tmax_dim
    end
    if c <= length(csv_dir_tmin)
    tmin_csv = CSV.read(join(["C:/Users/andrew.bannerman/Desktop/Julia/scripts/GHCN data/ghcnd_all_csv/tmin/", csv_dir_tmin[c]]), DataFrame, header=true)
    global tmin_dim = size(tmin_csv,1)
        tmin_all_total_output_size[c] = tmin_dim
    end
    if c <= length(csv_dir_tavg)
    tavg_csv = CSV.read(join(["C:/Users/andrew.bannerman/Desktop/Julia/scripts/GHCN data/ghcnd_all_csv/tavg/", csv_dir_tavg[c]]), DataFrame, header=true)
    global tavg_dim = size(tavg_csv,1)
        tavg_all_total_output_size[c] = tavg_dim
    end
end

# sum total dimension of all .csv files
tmax_sum = sum(tmax_all_total_output_size)
tmin_sum = sum(tmin_all_total_output_size)
tavg_sum = sum(tavg_all_total_output_size)

# initialize final output to total final dimension
tmax_date_array = fill(Date("13000101", "yyyymmdd"),tmax_sum)
tmax_array = zeros(tmax_sum)
tmin_date_array = fill(Date("13000101", "yyyymmdd"),tmin_sum)
tmin_array = zeros(tmin_sum)
tavg_date_array = fill(Date("13000101", "yyyymmdd"),tavg_sum)
tavg_array = zeros(tavg_sum)

# initialize outputs
tmax_all = DataFrame(Date = tmax_date_array, TMAX = tmax_array)
tmin_all = DataFrame(Date = tmin_date_array, TMIN = tmin_array)
tavg_all = DataFrame(Date = tavg_date_array, TAVG = tavg_array)
tmax_count = 0
tmin_count = 0
tavg_count = 0

然后开始填充初始化的df。

【讨论】:

  • 最终的 .csv 文件导出为 3.5GB 的 tmax
猜你喜欢
  • 2023-01-05
  • 2015-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
  • 2012-09-20
相关资源
最近更新 更多