9

我目前正在从事一个涉及索引大量文件(240k)的研究项目;它们主要是 html、xml、doc、xls、zip、rar、pdf 和文本,文件大小从几 KB 到超过 100 MB。

提取所有 zip 和 rar 文件后,我最终得到一百万个文件。

我正在使用支持 TPL Dataflow 和 Async CTP V3 的 Visual Studio 2010、C# 和 .NET 4.0。为了从这些文件中提取文本,我使用 Apache Tika(使用 ikvm 转换)并使用 Lucene.net 2.9.4 作为索引器。我想使用新的 TPL 数据流库和异步编程。

我有几个问题:

  1. 如果我使用 TPL,我会获得性能优势吗?它主要是一个 I/O 过程,据我了解,当您大量使用 I/O 时,TPL 不会提供太多好处。

  2. 生产者/消费者方法是否是处理此类文件处理的最佳方式,还是有其他更好的模型?我正在考虑使用阻塞集合创建一个具有多个消费者的生产者。

  3. TPL 数据流库对这种类型的流程有用吗?似乎 TPL 数据流最适合用于某种消息传递系统......

  4. 在这种情况下我应该使用异步编程还是坚持同步?

4

2 回答 2

1

在处理外部资源时,async/await绝对有帮助——通常是 Web 请求、文件系统或数据库操作。这里有趣的问题是您需要同时满足多个要求

  • 消耗尽可能少的 CPU(这是 async/await 会有所帮助的地方)
  • 同时执行多个操作,并行
  • 控制启动的任务数量(!) - 如果您不考虑这一点,您可能会在处理许多文件时用完线程。

你可以看看我在 github 上发布的一个小项目:

并行树行者

它能够有效地枚举目录结构中的任意数量的文件。您可以定义要对每个文件执行的异步操作(在您的情况下对其进行索引),同时仍控制同时处理的最大文件数

例如:

await TreeWalker.WalkAsync(root, new TreeWalkerOptions
{
    MaxDegreeOfParallelism = 10,
    ProcessElementAsync = async (element) =>
    {
        var el = element as FileSystemElement;
        var path = el.Path;
        var isDirectory = el.IsDirectory;

        await DoStuffAsync(el);
    }
});

(如果你不能直接将工具作为dll使用,你可能仍然会在源代码中找到一些有用的例子)

于 2016-10-11T20:42:40.420 回答
0

您可以使用Everything Search。SDK 是开源的,并有 C# 示例。这是我见过的在 Windows 上索引文件的最快方法。

常见问题解答

1.2 索引我的文件需要多长时间?

“Everything”仅使用文件和文件夹名称,通常需要几秒钟来构建它的 > 数据库。全新安装 Windows XP SP2(大约 20,000 个文件)需要大约 1 秒的时间来建立索引。1,000,000 个文件大约需要 1 分钟。

不过,我不确定您是否可以使用 TPL。

于 2012-05-16T19:55:34.073 回答