【问题标题】:Best way to generate file names automatically in s3 using python使用python在s3中自动生成文件名的最佳方法
【发布时间】:2020-05-18 08:26:02
【问题描述】:

我有一个 python 脚本,我正在构建一个 doc2vec 模型并将其保存到具有不同版本名称的 s3。
参考截图

现在我的数据库中的数据每周更新一次,我需要重新构建包含新数据的 doc2vec 模型。

为此,我在 AWS lambda 中安排了一个脚本每周运行一次 python 脚本。

现在我想将模型保存到 s3 中,model_name 本周以“model_d2v_version_008”开头,下周以“model_d2v_version_009”开头,以此类推。

我曾经在自动化流程之前提供模型名称

def d2v_doc(titles_df):
    tagged_data = [TaggedDocument(words=_d, tags=[str(titles_df['id_titles'][i])]) for i, _d in enumerate(titles_df['doc'])]
    model_d2v = Doc2Vec(vector_size=300,min_count=10, dm=1)
    model_d2v.build_vocab(tagged_data)
    model_d2v.train(tagged_data,epochs=100,total_examples=model_d2v.corpus_count)
    return model_d2v

def save_d2v_to_s3(model,fname):
    model_name = fname
    joblib.dump(model,model_name)
    s3_base_path='s3://sd-flikku/datalake/doc2vec_model'
    path = s3_base_path+'/'+model_name
    command = "aws s3 cp {} {}".format(model_name,path).split()
    print('saving...'+model_name)
    subprocess.call(command)


model_doc = d2v_doc(titles_df)

save_d2v_to_s3(model_doc,"model_d2v_version_007")

现在,由于流程是自动化的,我希望 model_names 保持相同的格式并每周增加版本计数。我该怎么做?

【问题讨论】:

  • 您是否有特别需要递增数字的特殊原因?这个数字有什么重要的意义吗?如果没有,我建议生成一个唯一名称 (UUID),或者可能只是基于日期(这具有在名称中传达一些信息的额外好处)。这两个选项都将避免名称冲突,并且您不需要数据库来跟踪最近使用的号码。
  • @JohnRotenstein 使用版本号是有原因的。可以肯定的是,命名约定很容易理解,另一件事是我可以跟踪我的模型的性能,然后我可以选择具有高精度的最佳模型。
  • 我建议在名称中使用YYYYMMDD 日期格式。它们也将进行排序,并将提供有关它们何时创建的概念。比+1 号码更有意义。

标签: python-3.x amazon-web-services amazon-s3 doc2vec


【解决方案1】:

按照@john-rotenstein 在评论中的建议,使用YYYYMMDD 的后缀或前缀将是一个非常可靠的选择,这是明智的专业程序员的典型选择。

它编码了额外的有用信息。如果偶尔发生故障或异常情况,使一次运行更晚、更早或永远不会发生,它们仍然会按正确的顺序排序,并带有一些关于所发生偏差的提示。 (“哦,20200719不见了。那不是流星撞击的那一周吗?”)

如果系统的寿命比预期的长,或者移动到一个加速的时间表(只要它仍然每天不超过一次),它们仍然按正确的顺序排序。 (007 形式的数字在达到1000 时会停止排序。)

如果您确实希望每天创建多个模型,则可以使用精确到分钟或秒的后缀(YYYYMMDDHHMMSS,甚至可能使用尾随的“Z”来暗示 UTC),例如现在'model_d2v_version_20200518183227Z'.

如果您需要仅使用 AWS 存储桶信息计算所有版本,则它需要与任何其他编号相同的迭代键(到达最后一项),同时使其他有用信息(最早、最新)生动在文件名中。

制作新的存档只需要准确的系统日期即可。 (而且,虽然时钟错误会导致各种棘手的错误,但如今能够读取/写入 S3 的系统几乎总是有一个可靠的日期。)确保您不会无意中重用名称,从而可能会破坏一个之前的运行,需要完全相同数量的检查。 (不过,如果存在多个系统/进程以近乎同时/交错的方式尝试相同操作的风险,那么风险窗口仍然很小。)

另一方面,如果您真的想使用简单的固定宽度递增版本号,请将上次使用的版本号存储在某处。当你需要一个新名字时......

this_version = last_version + 1
model_name = 'model_d2v_version_{0:03d}'.format(this_version)
# then store this_version somewhere you can read it into last_version later

但是基于日期/时间戳的命名要好得多:

from datetime import datetime
model_name = 'model_d2v_version_' + datetime.utcnow().strftime('%Y%m%d%H%M%SZ')

【讨论】:

  • 非常感谢您的回答,它确实帮助我解决了问题。
猜你喜欢
  • 2023-03-08
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 2013-02-17
  • 1970-01-01
  • 2021-04-07
  • 1970-01-01
相关资源
最近更新 更多