【发布时间】:2009-01-26 13:19:13
【问题描述】:
我正在编写一个小程序,它为我的目录中的所有文件创建索引。它基本上遍历磁盘上的每个文件并将其存储到可搜索的数据库中,就像 Unix 的定位一样。问题是,索引生成速度很慢,因为我有大约一百万个文件。
一旦我生成了索引,是否有一种快速的方法可以找出自上次运行以来磁盘上添加或删除了哪些文件?
编辑:我不想监控文件系统事件。我认为风险太高而无法同步,我更喜欢快速重新扫描之类的东西,它可以快速找到添加/删除文件的位置。也许与目录上次修改日期或其他什么?
一个小基准
我只是做了一个小基准测试。跑步
dir /b /s M:\tests\ >c:\out.txt
只需 0.9 秒,即可为我提供所需的所有信息。当我使用 Java 实现 (much like this) 时,大约需要 4.5 秒。任何想法如何至少改进这种蛮力方法?
【问题讨论】:
-
我们是否可以假设我们只对添加和删除的文件感兴趣,即我们只索引文件名,其他所有内容(例如大小、上次修改时间、加密哈希)都无关紧要?
-
我们可以假设它仅适用于 Windows 平台吗?您可以使用 Microsoft 提供的索引服务(而不是自己滚动)吗?
-
另外,为什么您认为监视文件系统事件会存在不同步的风险?我不知道在 Java 中,但在 C#/.NET 中,您可以创建事件侦听器,在添加或删除给定路径下的文件或目录时触发,并且它 100% 的时间都可以工作......
-
@Coder,因为这样就要求应用程序一直在运行。也许最好像 Aaron Digulla 的回答那样快速扫描目录更改,然后在应用程序运行时使用事件侦听器。
标签: java file filesystems