我想用 node.js 制作一个包含数万个文件的库,存储在数据库(sqlite 或其他东西)中(类似于 Plex 对视频的处理方式)。这些文件将在本地可供 node.js 服务器或通过 NAS 或其他东西使用。处理文件后,有关文件(及其位置)的信息将存储在数据库中。我想制作一个扫描功能,可以扫描某个目录(以及该目录的子目录)以查找文件。我想跳过之前已经处理过的文件。跟踪哪些文件已被处理的最佳方法是什么?它需要处理数以万计的文件。我有几个想法:
- 使用像
fs.watch
or之类的文件观察器chokidar
。缺点是这个观察者总是需要运行以检测新文件,并且在服务器关闭时不会向后工作。 - Cron 作业检查文件并在处理文件时将文件移动到新目录(首选我不需要移动文件的解决方案)
- 基于内容散列:散列并存储已处理文件的内容,并检查新文件的散列是否已经在数据库中(需要对每个文件进行数据库调用,并且还必须检查每个文件的内容并对其进行散列文件,使性能变差)
- 仅基于文件名:从数据库中获取所有已处理的文件名并遍历所有文件并检查它们是否在已处理的文件名列表中。当有很多文件时,性能可能会很差(既要遍历那么多文件,又要将数据库中所有已处理的文件名存储在一个对象中,从而使内存成为瓶颈)。
以上所有场景都存在性能问题,并且在要检查的文件很多时可能无法正常工作。我能想到的唯一高性能解决方案是每次从目录中抓取 10 个左右的文件needs-processing
并将文件移动到processed
目录中,但我想要一个无需移动文件的高性能解决方案。我想要一个可以上传所有文件的文件夹,当我上传新文件时,它要么定期检查新文件,要么我必须触发重新扫描库来检查新文件。