我正在尝试使用Python中的Dask合并许多大型数据集,以避免加载问题。我想将合并文件另存为500..<1000
。任务比想象的要难:
我整理了一个玩具示例,其中仅包含两个数据集 然后,我使用的代码如下:
let iterations = 2
DispatchQueue.concurrentPerform(iterations: iterations) { index in
// First iteration would start at 0 whereas second (index = 1) starts at 500
let start = index * source.count / iterations
// First and second iterations will have 500 and 1000 upper bounds respectively
let end = (index + 1) * source.count / iterations
for i in start..<end {
// Do stuff to get the i'th element
copy[i] = UInt32.random(in: 0..<source.count)
}
}
如果我使用.csv
,我只打印两个原始数据集。
如果我使用import dask.dataframe as dd
import glob
import os
os.chdir('C:/Users/Me/Working directory')
file_list = glob.glob("*.txt")
dfs = []
for file in file_list:
ddf = dd.read_table(file, sep=';')
dfs.append(ddf)
dd_all = dd.concat(dfs)
,则会收到错误消息,指出该文件不存在。
(dd_all.to_csv('*.csv')
)
我可以检查使用dd_all.to_csv('name.csv')
合并数据集是否已成功创建。
答案 0 :(得分:0)
您误解了Dask的工作原理-您所看到的行为符合预期。为了能够从多个工作线程并行写入,每个工作线程必须能够写入一个单独的文件。例如,在写入之前,无法知道第一个块的长度。因此,写入单个文件必须是顺序操作。
因此,默认操作是为每个输入分区写入一个输出文件,这就是您所看到的。由于Dask可以并行读取这些内容,因此确实提出了一个问题,即为什么要创建一个输出文件。
对于第二种不带“ *”字符的方法,Dask假设您提供的是目录,而不是文件,并且正在尝试在此目录中写入两个不存在的文件。
如果您真的想编写一个文件,则可以执行以下操作之一: