der*_*ert 6 command-line software-rec cache
我有时会一遍又一遍地运行相同的、相当昂贵的命令,以获得相同的输出。例如,ffprobe获取有关媒体文件的信息。给定相同的输入,应该总是产生相同的输出——所以缓存应该是可能的。
我已经看到Memoizing/caching 命令行输出,但我正在寻找更彻底的实现:特别是,那个似乎只是比较命令行 - 如果传递的文件之一被修改,它不会注意到。(它还有一堆固定长度的缓冲区,这让我很怀疑,奇怪的是它是一个守护进程。)
在我开始自己写之前,我很好奇是否已经存在。关键要求:
/dev/nullas stdin,以及两个不同的文件作为 stdout 和 stderr。基本上我想做什么,如果我自己写,是(为了简洁而跳过一些锁定和错误检查):获取命令行 + 命令行上每个项目的统计结果(错误或开发,inode,大小,mtime ) 并通过 SHA-512 或 SHA-256 传递整个混乱。这将提供一个固定大小的密钥,但如果命令或文件发生更改,则会更改(除非有人进行了大小和 mtime 保留更改,在这种情况下,他们应得的)。检查该键是否在缓存目录中。如果它已经存在,将它们的内容复制到 stdout 和 stderr。否则,在带有 stdin /dev/null 和两个文件作为 stdout 和 stderr 的子进程中运行该命令。如果成功,将文件放入缓存目录。然后将它们的内容复制到 stdout 和 stderr。如果结果是我自己写的,欢迎设计反馈。
这更像是一个大脑转储而不是真正的答案,但对于评论来说太长了。如果不合适我会删除它。请告诉我。耸肩
首先,我认为主要问题是您从“命令-->结果”的角度来思考。如果是“文件 --> 结果”,您可以使用make. 如果只有少量固定数量的命令从文件引导到结果,您仍然可以使用make:为每个命令编写一个make目标。
如果您坚持应该是“任意命令 --> 结果”,首先想到的是某种 REPL,或者 shell-in-language-X。如今这些东西并不缺乏,似乎每两周左右就会出现一个新的。重点是,这些将允许您处理结构化数据,而不仅仅是一个字符串(命令)和多个文件。
获取dev+ inode+ size+的校验和mtime似乎是明智的。如果您担心误报,您始终可以进行完整比较(附带说明:完整比较始终比对每个文件采用 SHA-* 并比较结果更快)。对于后端,您可以使用 SQLite,但您需要某种机制来使旧记录过期。
如果您能够指出命令和/或文件的更多限制,事情可能会更容易。旨在实现“命令-->结果”的完全通用缓存,但仍然跟踪输入文件中的更改似乎有点过于雄心勃勃。