我必须在8秒内检测可播放的媒体(audio,video和图像)是否已在具有30,000个文件的16GB笔驱动器上进行更改,以便随后插入。 其他文件,如pdf或纯文本不予考虑; 这是一个媒体播放器软件。
我试过ls -l
和md5
但需要10-11秒。 有没有人曾经解决过这个问题或任何策略,你可以build议?
内容可以改变的场景是用户可以popup笔驱动器,向其添加更多的歌曲,并重新插入相同的笔驱动器。 如果没有内容改变,那么我可以使用旧的数据库,从而节省游戏时间。
我不能依靠时间戳,因为在Windows系统上重命名文件不会改变修改时间。
只需检查文件大小而不是md5总和。 这应该是更快,更少的资源密集型。
我假设你在这里对ls的输出进行哈希处理,以便在重命名,添加,大小变化或时间戳(对于播放效果良好的系统)中引发哈希更改,因为我猜测哈希值为16GB,分割超过30,000个文件比11秒钟长得多(尽管这个建议大部分应该以任何方式工作)
您可能最终不得不使用低级别的API编写自己的代码来访问文件列表。 ls的设计是为了人类的可读性而不是速度。 你不需要查询人类可读的权限,用户名,组等等,你将通过管道到md5来引发内存拷贝。
你可以尝试使用看起来更快的find命令,只能指定文件。 如果没有管道,它仍然会比真正的节目效率低。 这个是非递归的(但ls -l也是如此),如果你想要比name更多的话,你也可以指定自定义的格式化输出:
find . -maxdepth 1 -type f | md5sum
你也可以尝试一个替代散列到MD5。 MD5是一个密码散列,它的设计是为了防止故意的恶意冲突,但结果是慢的。
MurmurHash3是最快或最新的xxhash之一 。 但是这将取决于数据的硬件和大小(一些散列已经针对小键盘进行了优化,例如散列映射)。
你也可以尝试和线程。 有一个线程从驱动器中连续读取文件列表,并以尽可能快的速度散列它们。
如果你想用一个标准的shell来做这件事,但是不写你自己的代码,这将是一个痛苦。
说了这么多,你的主要瓶颈可能就是闪存的速度。 如果你的CPU等待I / O,那么世界上所有的技巧都无济于事。 我不确定这是一个很好的“挑战”,因为它取决于驱动器制造商和USB版本(除非已经指定)。 但是,也许所有这一切都可能削减几秒钟,并把你带入你的目标。 或者只是得到一个更快的USB棒。