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



我有一个包含文件的目录。档案馆很大,里面有150万个pdf文件
该目录存储在带有操作系统V7R1的IBMi服务器上,并且该机器是新的并且速度非常快
文件的名称如下:

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

不,我尝试使用Shell使用find命令查找文件。

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

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

如果我尝试使用较小的目录,一切都会很好。

以后我想有一个每天运行的工作,找到过去24小时创建的文件,但我总是运行得很慢,我可以忘记这一点。

该调用永远不会工作,因为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万个文件的模式在任何文件系统上都是低效的。

为了只查看目录中的新条目列表,您可以考虑对目录进行日志记录。您可以指定INHERIT(*NO)来防止记录目录中的所有文件。然后,您可以简单地使用DSPJRN提取最近的日志条目,以了解添加了哪些对象。

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

作为单个流文件对象存储会带来需要解决的所有权/权限问题。一些概要文件正在将条目放入其拥有的对象表中,我预计该概要文件会变得相当大。也许达到了一个或多个极限。

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

或者一些类似的物体。。。可能会有一个清除/归档过程,将行移到辅助表或第三级表。很难猜测这可能需要如何构建,如果有的话。

保存也可能受益,尤其是SAVECDTA和SAV保存。安全数据大大减少。保存一个4GB的表比保存一千个4MB的对象(或者任何可能的细分)更快。

除了确定最初的设置和实现在您的环境中会如何进行之外,最棘手的部分可能涉及波动性。如果这些是相对较少更改和删除的稳定对象,那么应该没问题。但是,如果经常修改BLOB,当表占用DASD容量的很大一部分时,可能会带来麻烦。当它超过DASD可用空间的大小并且需要重新组织时,它会变得特别粗糙。在波动性较低的情况下,这就不那么令人担忧了。

在这种情况下,通常要创建子目录——可能是使用每个文件的第一个字母。。例如,文件abcsdsjahdjhfdsfds.xyz将存储在/something/a/abcsdsjahdjhfdsfds.xyz这将减少每个子目录的大小。。

最新更新