javascript 清理对象存储的“最优”算法

wn9m85ua  于 2023-03-21  发布在  Java
关注(0)|答案(1)|浏览(101)

我有一个门户网站,客户可以在其中保存用户生成的内容,包括图像。每当有新图像上传到我的门户网站时,我都会将图像文件保存在S3对象存储[bucket]中,并在数据库中持久化对该文件的引用。这很好。
客户有时会用更新/不同的版本替换以前保存的图像。我再次将图像保存在同一个存储桶中,并更新数据库记录以引用新版本。
这将导致许多孤立的图像-那些不再在任何地方使用,但仍然存在于对象存储中的图像。我想删除这些图像,因为它们不再在任何地方使用。
朴素的版本是:

const query = `
    SELECT
      row_to_json(s)
    FROM (
      SELECT
        filename
      FROM
        items
    ) s
  `;
  const result = await server.pg.query(query);
  const items = result.rows.map((j) => j.row_to_json);
  const allFiles = getS3Files();
  for (let i = 0; i < allFiles.length; i++) {
    if (!items.contains(allFiles[i])) {
      await unlink(allFiles[i]);
    }
  }

然而,这将是一个非常昂贵和缓慢的方式清除我的对象存储。
有什么想法可以优化吗?

vhipe2zx

vhipe2zx1#

如果在创建孤立文件时无法检测到孤立文件,则需要垃圾收集过程。
这基本上就是您概述的过程,除了您可以增量地执行它。
1.记住回合开始的时间;
1.以任意顺序扫描项目中的文件名。您发现的每个文件都是 * 使用过的 *。当您发现它时,请记住它的“最后使用”时间。
1.以任意顺序扫描S3中的文件,删除“最后使用”时间早于回合开始且“创建时间”早于回合开始的任何文件
扫描完S3后,您可以开始新一轮。
正如我提到的,您可以 * 增量地 * 执行此操作。每次添加文件时,您要么在items中扫描4个文件名,要么在S3中扫描4个文件名,这取决于您所处的过程阶段。
此外,每当修改items时,请将其标记为已使用,以便在当前回合中无法删除它们。
以这种速度递增地运行垃圾收集过程将确保S3中最多三分之二的文件在任何时候都是孤立的。

相关问题