在巨大的目录中查找文件 - 非常慢

时间:2014-01-10 08:13:33

标签: shell ibm-midrange ibm-ifs

我有一个包含文件的目录。存档非常大,里面有150万个pdf文件 该目录存储在带有OS V7R1的IBM i服务器上,并且该机器是新的且速度非常快 这些文件的名称如下:

invoice_[custno]_[year']_[invoice_number].pdf  
invoice_081500_2013_7534435564.pdf    

我尝试使用命令行管理程序尝试使用find命令查找文件。

find  . -name 'invoice_2013_*.pdf'  -type f | ls -l > log.dat

命令花了很长时间,所以我中止了操作而没有结果。

如果我尝试使用较小的目录,一切正常。

后来我希望有一份工作能够在过去的24小时内完成,但我发现它运行的速度很慢,我可以忘记这一点。

4 个答案:

答案 0 :(得分:6)

该调用永远不会起作用,因为ls不会从stdin读取文件名。

可能的解决方案是:

使用find实用程序的内置列表选项:

find . -name 'invoice_2013_*.pdf' -type f -ls > log.dat

使用find实用程序的-exec选项为每个匹配的文件执行ls -l

find . -name 'invoice_2013_*.pdf' -type f -exec ls {} \; > log.dat

将文件名传递给xargs实用程序,让它以文件名作为参数执行ls -l

find . -name 'invoice_2013_*.pdf' -type f | xargs ls -l > log.dat

在单个目录中对150万个文件进行模式搜索在任何文件系统上都是低效的。

答案 1 :(得分:1)

仅查看目录中的新条目列表,您可以考虑journaling the directory。您可以指定INHERIT(*NO)以防止日记记录目录中的所有文件。然后,您可以使用DSPJRN简单地提取最近的日记帐分录,以找出已添加的对象。

答案 2 :(得分:0)

我认为我不会在一个目录中放置超过15k的文件。一些QShell实用程序在大约16k文件中遇到麻烦。但是我不确定在任何情况下我都会将它们存储在一个目录中,除非那些超过16MB,如果这是总数的很大一部分。我可能会先将它们存储在数据库中的CLOB / BLOB中。

存储为单个流文件对象会带来需要解决的所有权/权限问题。一些配置文件正在将条目添加到其拥有对象表中,并且我希望该配置文件变得非常大。也许达到一个或多个限制。

通过存储在数据库中,您可以转到单个拥有的对象。

或者也许是一些类似的对象......可能有一个清除/存档过程将行移到二级或三级表。如果有的话,很难猜测可能需要如何构建。

保存也可以受益,尤其是SAVSECDTA和SAV节省。安全数据大大减少。保存4GB的表比保存一千个4MB的对象(或任何可能的故障)更快。

除了确定原始设置和实施将如何适应您的环境之外,最棘手的部分可能涉及波动性。如果这些是变化相对较少且删除很少的稳定对象,那么应该没问题。但是如果BLOB经常被修改,当表占用DASD容量的很大一部分时,它会带来麻烦。当它超过DASD可用空间的大小并且需要重新组织时,它变得特别粗糙。由于波动性较低,因此不太关注。

答案 3 :(得分:0)

通常在这种情况下所做的是创建子目录——也许通过使用每个文件的第一个字母。例如,文件 abcsdsjahdjhfdsfds.xyz 将存储在 /某事/a/abcsdsjahdjhfdsfds.xyz 这将减少每个子目录的大小..