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,并保留原来的扩展名。

posted @ 2026-04-18 10:26  欢腾嘻嘻  阅读(20)  评论(0)    收藏  举报