【问题标题】:Dealing with a very large number of files处理大量文件
【发布时间】:2012-05-14 19:35:01
【问题描述】:

我目前正在从事一项研究项目,该项目涉及对大量文件 (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. 在这种情况下我应该使用异步编程还是坚持同步?

【问题讨论】:

  • 是的,一百万个文件基本上是一个 I/O 瓶颈。在问题上投入 cpu 周期不会很有效,我认为 Google 硬件无法实现。仅在几个文件上彻底测试您的代码。然后把它赔上百万,然后在海滩上休息一天。
  • 我会尝试“一些线程从 docs、pdf 等中提取文本并将结果放入阻塞集合”和“一些索引器踏板(共享 IndexWriter 的相同实例)索引文档”。
  • 只是一个随机的想法:如果您真的受到 I/O 的限制,您可以购买一些小型、便宜的 HDD 并将它们 RAID 到一个分区中 - 这应该很容易将您的 I/O 速率提高几倍.
  • @Superbest 当然是的,但这不是我开始这项研究的原因,我想看看是否有可能在使用 .NET 框架必须提供的最新技术的同时运行这台普通机器。到目前为止,我已经设置了一个 Dataflow 生产者/消费者,第一个结果看起来很有希望。
  • 如果你有一些解决方案,请分享一些信息,看看你最终会采用哪种解决方案非常有趣

标签: c# file-io task-parallel-library async-ctp tpl-dataflow


【解决方案1】:

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

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

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

Parallel tree walker

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

例如:

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使用,还是可以在源码中找到一些有用的例子)

【讨论】:

    【解决方案2】:

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

    来自常见问题解答

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

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

    我不确定你是否可以使用 TPL。

    【讨论】:

    • Tnx 回复,但这不是我要找的...我已经知道需要索引的文件,我需要一种方法来提取文本并索引文件的内容不会给我的机器带来太多压力。
    猜你喜欢
    • 2023-03-24
    • 2017-12-16
    • 2018-03-19
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多