C 在8秒内检测16 GB笔驱动器上的内容更改

C 在8秒内检测16 GB笔驱动器上的内容更改,c,linux,driver,media,C,Linux,Driver,Media,我必须在8秒内检测包含30000个文件的16GB笔式驱动器上的可播放媒体(音频、视频和图像)是否已更改,以便后续插入。不考虑其他文件,如pdf或纯文本;这是一款媒体播放器软件 我尝试了ls-l和md5,但需要10-11秒。以前有没有人解决过这个问题,或者你能提出什么策略 内容可以更改的情况是,用户可能会弹出笔驱动器,向其中添加更多歌曲,然后重新插入相同的笔驱动器。如果没有内容更改,那么我可以使用旧数据库,从而节省播放时间 我不能依赖时间戳,因为在Windows系统上重命名文件不会改变修改时间。只

我必须在8秒内检测包含30000个文件的16GB笔式驱动器上的可播放媒体(音频、视频和图像)是否已更改,以便后续插入。不考虑其他文件,如pdf或纯文本;这是一款媒体播放器软件

我尝试了
ls-l
md5
,但需要10-11秒。以前有没有人解决过这个问题,或者你能提出什么策略

内容可以更改的情况是,用户可能会弹出笔驱动器,向其中添加更多歌曲,然后重新插入相同的笔驱动器。如果没有内容更改,那么我可以使用旧数据库,从而节省播放时间


我不能依赖时间戳,因为在Windows系统上重命名文件不会改变修改时间。

只需检查文件大小,而不是md5总和。这应该更快,资源消耗更少。

我假设您在这里对ls的输出进行散列,以便在重命名、添加、大小更改或时间戳时触发散列更改(对于玩得不错的系统),因为我猜对30000个文件进行16GB的散列将花费11秒以上的时间(尽管大多数建议都应该适用于任何一种情况)

您可能最终不得不使用较低级别的API编写自己的代码来访问文件列表。ls的设计目的是让人可读,而不是为了提高速度。您不需要查询人可读的perms、用户名、组等,您将通过管道将其传输到md5来生成内存副本

您可以尝试使用find命令,该命令似乎更快,而且只能指定文件。与没有管道的实际程序相比,该命令的效率仍然较低。此命令是非递归的(但ls-l也是如此),如果您需要的不仅仅是名称,还可以指定自定义格式输出:

find . -maxdepth 1 -type f | md5sum
您还可以尝试MD5的另一种哈希。MD5是一种加密哈希,旨在防止蓄意恶意冲突,但因此速度较慢

是最快或更新的。但这取决于硬件和数据的大小(一些哈希针对小键进行了优化,例如针对哈希映射)

你也可以尝试线程化。让一个线程不断地从驱动器读取文件列表,另一个线程尽可能快地对它们进行散列

但是,如果您希望使用标准shell而不编写自己的代码,那么这将是一件痛苦的事情


话虽如此,您的主要瓶颈可能是闪存的速度。如果您的CPU在等待I/O时耗尽,那么世界上所有的技巧都无济于事。我不确定这是否是一个好的“挑战”,因为这在很大程度上取决于驱动器制造商和USB版本(除非已指定)。但也许做所有这些都可以缩短几秒钟,让你实现目标。或者干脆换一个更快的u盘。

后退一步……什么过程会改变文件?你能让它通知你发生了变化吗?@Adam:请看编辑这首歌添加到的父目录的修改时间戳得到了吗更新?Git使用sha1和一些标题信息来完成此操作,并且具有缓存机制。也许你可以学习Git的一部分。根据你使用的文件系统,你也可以查看NTFS日志。但是用户可能会删除一首歌和另一首同样大小的歌。这样,如果我理解正确,我们将错过这首歌,或者一个文件的内容可以是c更改而不更改其大小。(例如,有人可能会修复ID3标记中的拼写错误,将一个字符替换为另一个字符。)最好是查看文件的修改时间戳,而不是或除了大小。+ 1,这是RSyc所做的,只是大小,我已经看到了检查100000秒的文件。考虑混合方法,首先检查文件大小,如果不同,然后肯定改变,如果相同,那么修改检查,如果不同的修改。然后日期肯定改变了,如果同一个日期做md5sum只是为了sure@Adam:但我不能依赖时间戳,因为在Windows系统上重命名文件不会更改修改时间戳。请给出确切的建议方法作为答案,以便在我没有正确理解的情况下更清楚地说明