slurm脚本运行同一程序,输出文件的命名问题
最近需要使用集群做计算,但是发现在同一个slurm脚本提交作业的时候,不同核之间的脚本是运行同一个程序,如果有输出文件的话一般是使用参数来命名,这样保证文件名都是独立的。但是我需要对同一组参数多次运行,这就可能会导致多个文件输出后文件名一样,文件被覆盖的问题。于是可以采用以下方法解决:
创建副本时添加一个序号,以确保每个副本都有唯一的文件名:
function create_unique_filename(base_path::String, extension::String)
if isfile(base_path * extension)
count = 1
while true
new_path = replace(base_path, r"(\.\w+)?$" => "_copy$count\\1")
if isfile(new_path)
count += 1
else
return new_path
end
end
else
return base_path * extension
end
end
extension = ".csv"
save_path = create_unique_filename(save_path, extension)
CSV.write(save_path, D̂_df)
println("File saved at $save_path")
这段代码中,我们定义了一个create_unique_filename函数,它会在文件名后添加_copy1、_copy2等序号,直到找到一个不存在的文件名为止。这样每次创建副本时都会保证文件名的唯一性。
当调用replace函数时,我们使用了正则表达式来匹配文件名中的扩展名部分。让我来解释一下这个表达式:
(\.\w+)?$:这是一个正则表达式,用来匹配文件名中的扩展名部分。在这个表达式中:\.\w+:表示一个点号(.)后面跟着一个或多个字母、数字或下划线的字符。这是用来匹配文件的扩展名的部分。(\.\w+)?:表示整个扩展名部分是可选的,也就是说文件名可以没有扩展名。$:表示匹配字符串的结尾。
所以,整个表达式(\.\w+)?$的作用是匹配文件名中的扩展名部分,如果有扩展名的话就匹配扩展名,如果没有扩展名则不匹配。
在replace函数中,我们使用这个正则表达式来匹配文件名中的扩展名部分,并用_copy$count\\1来替换匹配到的部分。这里的$count是一个变量,表示当前的副本序号。\\1表示保留原来的扩展名部分。所以整个replace函数的作用是在文件名中的扩展名部分后面添加_copy$count,并保留原来的扩展名。
君子坦荡荡,也要常嘻嘻呀!

浙公网安备 33010602011771号