我必须在8秒内检测包含30,000个文件的16 to笔式驱动器上的可播放媒体(音频、视频和图像)是否已更改,以便后续插入。不考虑其他文件,例如pdf或纯文本;这是用于媒体播放器软件的。
我尝试了ls -l
和md5
,但它花了我10-11秒。以前有没有人解决过这个问题,或者你有什么建议的策略?
内容可以改变的情况是,用户可以弹出笔驱动器,向其添加更多歌曲,并重新插入相同的笔驱动器。如果没有内容更改,那么我可以使用旧的数据库,从而节省播放时间。
我不能依赖时间戳,因为在Windows系统上重命名文件不会更改修改时间。
发布于 2014-09-11 14:08:13
只需检查文件大小,而不是md5 sums。这应该要快得多,而且对资源的消耗要少得多。
发布于 2014-09-11 15:45:12
我假设您在这里散列ls的输出,以便在重命名、添加、大小更改或时间戳上触发散列更改(对于运行良好的系统),因为我猜测散列16 on拆分30,000个文件所需的时间比11秒长得多(尽管这个建议中的大多数应该都有效)
您最终可能不得不使用较低级别的API编写自己的代码来访问文件列表。ls被设计成人类可读的,而不是为了速度。您不需要查询人类可读的perm、用户名、组等等,并且您将通过管道将其发送到md5来引起内存复制。
您可以尝试使用find命令,它看起来更快,并且可以只指定文件。它仍然比没有管道的真正程序的效率要低。这是非递归的(但ls -l也是如此),如果您想要的不只是名称,还可以指定自定义格式输出:
find . -maxdepth 1 -type f | md5sum
您还可以尝试使用MD5的替代散列。MD5是一种加密哈希,它的设计是为了防止故意的恶意冲突,但结果是速度较慢。
MurmurHash3是最快或较新的xxhash之一。但这将取决于硬件和数据的大小(一些散列针对较小的键进行了优化,例如用于哈希图)。
您也可以尝试将其线程化。让一个线程不断地从驱动器中读取文件列表,另一个线程尽可能快地对它们进行散列。
然而,如果你想用一个标准的shell来做这件事,而不写你自己的代码,这将是一件痛苦的事情。
话虽如此,你的主要瓶颈可能是闪存的速度。如果你的CPU正在等待I/O,那么世界上所有的技巧都不会有帮助。我不确定这是不是一个好的“挑战”,因为这将取决于驱动器制造商和USB版本(除非已经指定)。但也许这样做可能会减少几秒钟的时间,让你实现目标。或者干脆买个更快的U盘。
https://stackoverflow.com/questions/25780119
复制相似问题