为什么在使用dask的for循环中不尊重顺序?



为什么当我在下面的代码中运行for循环时,dask更喜欢先做'Four'然后'One',等等,而不是从第一个元素开始并以最后一个元素结束?是否有可能,我得到一些混合(错误)的结果,例如,它把一个文件/文件夹的内容到另一个?或者如果for循环中有条件,它们会被忽略等等?

提前感谢!

def compa(filename):
filex=pd.read_json('folder/{}'.format(filename))    
for jj in ['Zero', 'One', 'Two', 'Three','Four']:
filexz=filex[filex[jj]==1].reset_index(drop=True)

newpath = 'Newfolder/{}'.format(jj)
if not os.path.exists(newpath):
os.makedirs(newpath)
filexz.to_json('{}/{}'.format(newpath,filename))
delayed_results=[delayed(compa)(filename) for filename in filelist]
compute(*delayed_results, scheduler='processes')
用于复制的代码:
import pandas as pd
sof1=pd.DataFrame({'minus': ['a', 'b', 'c', 'd', 'e'],'Zero': [1, 0, 0, 0, 0],'One': [0, 0, 1, 0, 0],'Two': [0, 1, 0, 0, 0],'Three': [0, 0, 0, 0, 1],'Four': [0, 0, 0, 1, 0]})
sof2=pd.DataFrame({'minus': ['aa', 'bb', 'cc', 'dd', 'ee'],'Zero': [1, 0, 0, 0, 0],'One': [0, 0, 1, 0, 0],'Two': [0, 1, 0, 0, 0],'Three': [0, 0, 0, 0, 1],'Four': [0, 0, 0, 1, 0]})
sof3=pd.DataFrame({'minus': ['az', 'bz', 'cz', 'dz', 'ez'],'Zero': [1, 0, 0, 0, 0],'One': [0, 0, 1, 0, 0],'Two': [0, 1, 0, 0, 0],'Three': [0, 0, 0, 0, 1],'Four': [0, 0, 0, 1, 0]})
sof4=pd.DataFrame({'minus': ['azy', 'bzy', 'czy', 'dzy', 'ezy'],'Zero': [1, 0, 0, 0, 0],'One': [0, 0, 1, 0, 0],'Two': [0, 1, 0, 0, 0],'Three': [0, 0, 0, 0, 1],'Four': [0, 0, 0, 1, 0]})
sof5=pd.DataFrame({'minus': ['azx', 'bzx', 'czx', 'dzx', 'ezx'],'Zero': [1, 0, 0, 0, 0],'One': [0, 1, 0, 0, 0],'Two': [0, 0, 1, 0, 0],'Three': [0, 0, 0, 0, 1],'Four': [0, 0, 0, 1, 0]})
sof6=pd.DataFrame({'minus': ['azw', 'bzw', 'czw', 'dzw', 'ezw'],'Zero': [1, 0, 0, 0, 0],'One': [0, 0, 1, 0, 0],'Two': [0, 1, 0, 0, 0],'Three': [0, 0, 0, 0, 1],'Four': [0, 0, 0, 1, 0]})
sof7=pd.DataFrame({'minus': ['azyq', 'bzyq', 'czyq', 'dzyq', 'ezyq'],'Zero': [1, 0, 0, 0, 0],'One': [0, 0, 1, 0, 0],'Two': [0, 1, 0, 0, 0],'Three': [0, 0, 0, 0, 1],'Four': [0, 0, 0, 1, 0]})
sof8=pd.DataFrame({'minus': ['azxq', 'bzxq', 'czxq', 'dzxq', 'ezxq'],'Zero': [1, 0, 0, 0, 0],'One': [0, 0, 1, 0, 0],'Two': [0, 1, 0, 0, 0],'Three': [0, 0, 0, 0, 1],'Four': [0, 0, 0, 1, 0]})
sof9=pd.DataFrame({'minus': ['azwq', 'bzwq', 'czwq', 'dzwq', 'ezwq'],'Zero': [1, 0, 0, 0, 0],'One': [0, 0, 1, 0, 0],'Two': [0, 1, 0, 0, 0],'Three': [0, 0, 0, 0, 1],'Four': [0, 0, 0, 1, 0]})
filelist=[sof1,
sof2,
sof3,
sof4,
sof5,
sof6,
sof7,
sof8,
sof9]
import pandas as pd
import dask
from dask import compute, delayed
import os
def compa(filename):
filex=filename
for jj in ['Zero', 'One', 'Two', 'Three','Four']:
filexz=filex[filex[jj]==1].reset_index(drop=True)
newpath = 'Newfolderstackoverflow/{}'.format(jj)
if not os.path.exists(newpath):
os.makedirs(newpath)
filexz.to_json('{}/{}'.format(newpath,filename.loc[1,'minus']))
delayed_results=[delayed(compa)(filename) for filename in filelist]
compute(*delayed_results, scheduler='processes')

由于上面的代码立即运行,我不知道如何记录创建顺序,但首先"第四"one_answers";人;文件夹被创建,然后剩下的!(并且每个文件夹中文件的创建顺序不遵循文件列表中的顺序,这对我来说也是可以理解的,因为这些文件应该是并行计算的)

感谢评论和回答,特别是那些@MichaelDelgado这是如何解决的:我添加了60秒的睡眠,注意到60秒后它每次创建两个文件,并从文件夹0开始添加到4。我最初的问题是,由于最后几个文件在同一分钟内被添加到5个文件夹中,基于时间对文件夹进行排序是没有意义的,我的操作系统按字母顺序对它们进行排序(因此是"四";然后"人)

任务的执行顺序由以下几个因素决定:

  • 指定的优先级;
  • FIFO秩序;
  • 图结构。

关于混淆的可能性,只要内部代码是正确的(因此没有多个进程同时写入同一个文件),这应该是不可能的。正如@mdurant在评论中所指出的,看起来你的循环多次写入同一个文件。

相关内容

  • 没有找到相关文章

最新更新