我的 MacOS X 中的一个目录中有超过 100,000 个文件,看来我的脚本读取这些文件的速度很慢。
有没有什么限制或建议可以容纳这么多文件?我应该将它们分成几个目录吗?
我发现的局限性是无法处理mv * foo
所有 100,000 个文件。它会显示错误,提示“参数太长”。它适用于大约少于 20,000 个文件。
答案1
根据这个 Stack Overflow 上的答案和具体苹果网站上的详细信息,单个文件夹最多可包含 21 亿个项目。
话虽如此,但它能够容纳多达 21 亿件物品并不意味着它能够保持这一水平的性能。根据维基百科;重点是我的:
目录文件将所有文件和目录记录存储在单个数据结构中,当系统允许多任务时会导致性能问题,因为一次只有一个程序可以写入此结构,这意味着由于一个程序“霸占”了整个系统,许多程序可能都在队列中等待。这也是一个严重的可靠性问题,因为损坏该文件可能会破坏整个文件系统。
因此,由于目录文件一次只能由一个程序使用,因此性能自然会下降。如果目录大小增加,该问题导致的风险/性能下降只会加剧;文件越多,程序访问该目录中文件的机会就越多。进一步此处确认了这个想法;我再次强调:
目录文件的结构很复杂。由于它保存了所有文件和目录信息,因此会强制对文件系统进行序列化——当有大量线程想要执行文件 I/O 时,这不是理想的情况。在 HFS 中,任何创建文件或以任何方式修改文件的操作都必须锁定目录文件,这会阻止其他线程对目录文件进行只读访问。对目录文件的访问必须是单写入器/多读取器。
答案2
简短回答:好吧,如果您要读取 100,000 个文件,我可能预计脚本会很慢。
长答案:要更彻底地回答这个问题,您必须查看 Mac 上的文件系统。Mac 使用 HFS+ (分层文件系统 Plus),这是一个现代文件系统,有其局限性,但仅限于极端情况。
根据我的经验,它很像 Linux EXT 日志文件系统。它支持挂载目录、类似 UNIX 的权限等。它以 32 位格式处理文件,因此根据这来源。
在现代系统中,文件系统开始崩溃,文件大小超过 8 EB,而一个位置的文件和文件夹多达 21 亿个,如下所述这里。
考虑到 HFS+(或者实际上任何文件系统的设置方式)的设置方式,文件夹中有大量文件不应该发生任何“奇怪的”事情。
说实话,我认为将文件分布在更复杂的文件夹层次结构中不会提高性能。实际上,这种技术可能效率较低,因为您的脚本必须在过程中调用更改目录。