调用_csv时Dask数据帧存储器错误
我目前正在以以下方式使用Dask调用_csv时Dask数据帧存储器错误,dask,dask-dataframe,Dask,Dask Dataframe,我目前正在以以下方式使用Dask S3上有以下格式的文件列表: /filetype1.gz /filetype2.gz /filetype1.gz /filetype2.gz …等等 我的代码读取filetype1的所有文件,并建立一个数据帧并设置索引(例如:df1=ddf.read\u csv(day1/filetype1.gz,blocksize=None,compression='gzip')。设置索引(index\u col)) 读取filetype2的所有文件,并构建一个大数据帧
- S3上有以下格式的文件列表:
/filetype1.gz
/filetype2.gz
/filetype1.gz
/filetype2.gz
…等等
- 我的代码读取
的所有文件,并建立一个数据帧并设置索引(例如:filetype1
)df1=ddf.read\u csv(day1/filetype1.gz,blocksize=None,compression='gzip')。设置索引(index\u col)
- 读取
的所有文件,并构建一个大数据帧(与上面类似)filetype2
- 通过
将两个数据帧合并在一起merged_df=ddf.merge(df1,df2,how='internal',left_index=True,right_index=True)
- 通过以下方式将结果写入S3:
merged\u df.to\u csv()
到_csv
时发生了内存错误。我猜这是因为to_csv
调用compute
,它尝试计算联接的完整结果,然后尝试存储该结果。完整的文件内容当然不能放在内存中,但我认为(希望)Dask将运行计算并以内存感知的方式存储生成的数据帧。关于我应该如何使用Dask来完成我想做的事情,有什么指导或建议吗?提前谢谢
我看到在调用_csv时发生了内存错误。我猜这是因为to_csv调用compute,它尝试计算连接的完整结果,然后尝试存储该结果。完整的文件内容当然不能放在内存中,但我认为(希望)Dask将运行计算并以内存感知的方式存储生成的数据帧
总的来说,Dask确实会按照您期望的方式将事情组织起来并进行操作。以低内存的方式进行分布式连接很困难,但通常是可行的。如果没有更多的信息,我不知道如何在这里提供更多帮助,我理解在堆栈溢出时很难简洁地提供这些信息。我通常的建议是仔细观察仪表盘
注意:这里的目标实际上是在特定的一天内进行合并(即,在给定的一天内合并filetype1和filetype2),每天重复,并存储所有这些联接的并集,但似乎一次只进行一天的联接不会利用并行性,而且让Dask管理更大的联接会更有效
总的来说,你的直觉是正确的,一次给达斯克更多的工作是好的。然而,在这种情况下,看起来您知道一些Dask不知道的数据。您知道每个文件只与另一个文件交互。一般来说,连接必须以一个数据集的所有行都可以与另一个数据集的所有行交互的方式进行,因此Dask的算法必须非常通用,这可能会很昂贵
在你的情况下,我会使用熊猫和Dask delayed一次完成你所有的计算
lazy_results = []
for fn in filenames:
left = dask.delayed(pd.read_csv, fn + "type-1.csv.gz")
right = dask.delayed(pd.read_csv, fn + "type-1.csv.gz")
merged = left.merge(right)
out = merged.to_csv(...)
lazy_results.append(out)
dask.compute(*lazy_results)
我看到在调用_csv时发生了内存错误。我猜这是因为to_csv调用compute,它尝试计算连接的完整结果,然后尝试存储该结果。完整的文件内容当然不能放在内存中,但我认为(希望)Dask将运行计算并以内存感知的方式存储生成的数据帧
总的来说,Dask确实会按照您期望的方式将事情组织起来并进行操作。以低内存的方式进行分布式连接很困难,但通常是可行的。如果没有更多的信息,我不知道如何在这里提供更多帮助,我理解在堆栈溢出时很难简洁地提供这些信息。我通常的建议是仔细观察仪表盘
注意:这里的目标实际上是在特定的一天内进行合并(即,在给定的一天内合并filetype1和filetype2),每天重复,并存储所有这些联接的并集,但似乎一次只进行一天的联接不会利用并行性,而且让Dask管理更大的联接会更有效
总的来说,你的直觉是正确的,一次给达斯克更多的工作是好的。然而,在这种情况下,看起来您知道一些Dask不知道的数据。您知道每个文件只与另一个文件交互。一般来说,连接必须以一个数据集的所有行都可以与另一个数据集的所有行交互的方式进行,因此Dask的算法必须非常通用,这可能会很昂贵
在你的情况下,我会使用熊猫和Dask delayed一次完成你所有的计算
lazy_results = []
for fn in filenames:
left = dask.delayed(pd.read_csv, fn + "type-1.csv.gz")
right = dask.delayed(pd.read_csv, fn + "type-1.csv.gz")
merged = left.merge(right)
out = merged.to_csv(...)
lazy_results.append(out)
dask.compute(*lazy_results)
调用到\u csv
是否也必须延迟?这难道不会立即计算吗?延迟对象的方法在默认情况下是懒惰的对到\u csv
的调用也必须延迟吗?那不是马上就可以计算吗?延迟对象的方法在默认情况下是惰性的