javascript - 使用 node.js 扫描/跟踪许多文件并跳过已处理的文件

标签 javascript node.js file-io plex

我想用 node.js 创建一个包含数万个文件的库,存储在数据库(sqlite 或其他东西)中(类似于 Plex 对视频的处理方式)。这些文件将在本地可用于 node.js 服务器或通过 NAS 或其他东西。处理文件后,有关文件(及其位置)的信息将存储在数据库中。我想制作一个扫描功能,可以扫描某个目录(以及该目录的子目录)中的文件。我想跳过之前已经处理过的文件。跟踪哪些文件已被处理的最佳方式是什么?它需要处理数以万计的文件。我有几个想法:

  • 使用文件观察器,例如 fs.watchchokidar。缺点是此观察程序始终需要运行以检测新文件,并且在服务器关闭时不会向后工作。
  • Cron 作业遍历文件并在处理文件时将文件移动到新目录(最好是不需要移动文件的解决方案)
  • 基于内容哈希:哈希并存储已处理文件的内容,并检查新文件的哈希是否已经在数据库中(需要为每个文件调用数据库,并且还必须检查内容并为每个文件散列,使性能变差)
  • 仅基于文件名:从数据库中获取所有已处理的文件名并遍历所有文件并检查它们是否在已处理的文件名列表中。当有很多文件时,性能可能会很差(遍历那么多文件并将数据库中所有已处理的文件名存储在一个对象中,从而使内存成为瓶颈)。

以上所有场景都存在性能问题,并且当有很多文件要检查时可能无法正常工作。我能想到的唯一高性能解决方案是每次从 needs-processing 目录中抓取 10 个左右的文件并将文件移动到 processed 目录,但我想要一个性能我不必移动文件的解决方案。我想要一个文件夹,我可以在其中上传所有文件,当我上传新文件时,它会定期检查新文件,或者我必须触发重新扫描库来检查新文件。

最佳答案

将文件直接存储在数据库中而不是它们的位置。使用Filestream是一个选项。然后你只需添加某种标志,指示它是否已被处理。然后你可以遍历所有文件并知道它们是否已被处理。只需确保更新已处理文件的表。根据处理方式,您还可以将处理时间限制在方便的时间。

Ex.) 如果有可能不使用文件,但需要在使用前对其进行处理。然后您可以在调用之前处理文件,避免不断或定期检查。

就性能而言,就读写而言,这甚至可能比文件系统更快。 来自SQLite website :

... many developers are surprised to learn that SQLite can read and write smaller BLOBs (less than about 100KB in size) from its database faster than those same blobs can be read or written as separate files from the filesystem. (See 35% Faster Than The Filesystem and Internal Versus External BLOBs for further information.) There is overhead associated with operating a relational database engine, however one should not assume that direct file I/O is faster than SQLite database I/O, as often it is not.

关于javascript - 使用 node.js 扫描/跟踪许多文件并跳过已处理的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68163562/

相关文章:

javascript - 在 document.write 中包含 javascript 的原因

c - 为什么调用 fread 会将我的文件指针设置为空?

javascript - 错误 : ENOENT: no such file or directory, 打开 '../config.json'

javascript - 为什么此代码使用 Angular JS 给出 ngRoute 的注入(inject)器模块错误?

javascript - 初学者的 node.js 问题

.net - 如何在 F# 中的 .txt 文件中间添加一行

node.js - Node.js 中的文件系统与路径模块

javascript - 从 JSON 填充列表(不是 HTML)

javascript - Accordion 显示全部内容

javascript - 通过将鼠标悬停在子菜单上进行选择时,下拉菜单会消失