我有一个复杂的MPI4PY脚本,它给出了一个看似不可能的错误。
剧本的重要部分:
@NonNull
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<Contact> filtered = new ArrayList<>();
for(Contact contact:ORIGNAL){
if(contact.getName().toLowerCase().contains(constraint)){
filtered.add(contact);
}
}
FilterResults results = new FilterResults();
results.count = filtered.size();
results.values = filtered;
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
if(constraint.length() > 0 ) {
CONTACTS = (ArrayList<Contact>) results.values;
notifyDataSetChanged();
}
}
};
}
所以在第二次迭代后我得到for rnd in range(50):
if rnd > 0:
WEIGHT_FILE = '{}/weights_{}.wts'.format(WORK_DIR, rnd - 1)
WORK_DIR = '{}'.format(rnd)
if PROCESS_NUM == 0:
if not os.path.isdir(WORK_DIR):
os.mkdir(WORK_DIR)
....
。这怎么可能?如果目录存在,则不应创建它。 OS Error, cannot create directory, directory exists
是MPI排名,因此只有一个进程应该尝试创建它。是否存在某种竞争条件或锁定错误?有什么想法吗?
答案 0 :(得分:0)
您需要在检查之前创建完整路径名:
if not os.path.isdir(os.path.join(full_path, WORK_DIR)):
让我们使用:
os.makedirs(WORK_DIR, exist_ok=True)
答案 1 :(得分:0)
我似乎找到了答案,我深入了解架构,与python无关。
我在SLURM
使用了mpich
分发管理器,并且在其中一个节点上安装了open-mpi
以及mpich
并导致了一些问题。对于所有分配,该节点上的核心编号为0/1,导致脚本中的竞争条件导致多个核心具有相同的PROCESS_NUM
。