2014-01-10 37 views
0

我有一个包含文件的目录。这个档案非常大,里面有150万个pdf文件。
该目录存储在OS V7R1的IBM i服务器上,并且该机器新且速度非常快。
文件的命名是这样的:在巨大的目录中查找文件 - 很慢

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

没有我试图找到与使用Shell find命令文件。

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

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

如果我尝试使用较小的目录,所有工作正常。

后来我想有一份运行everey day的工作,发现最近24小时创建的文件,但是它运行得非常慢,我可以忘记这一点。

回答

4

该调用将永远不会工作,因为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 

在一个目录模式搜索1.5亿个文件是要在任何文件系统上都效率低下。

1

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

0

我不认为我会把超过15k的文件放在一个目录中。一些QShell实用程序在大约16k文件中遇到麻烦。但是我不确定我会在任何情况下将它们存储在目录中,除非可能是16MB以上的文件夹,否则这是相当大的一部分。我可能会首先将它们存储在数据库中的CLOB/BLOB中。

作为单独的streamfile对象存储会带来需要解决的所有权/权限问题。一些配置文件正在获取它的拥有对象表中的条目,我期望该配置文件变得非常大。也许达到一个或多个限制。

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

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

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

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

0

要改进从huge directory开始的搜索和文件或编码特定部分的快速过程,请使用下面的代码。

INHERIT(*NO)