应对海量文件的处理问题

9

我正在进行一个研究项目,其中包括索引大量文件(240k);它们主要是html、xml、doc、xls、zip、rar、pdf和文本文件,文件大小从几KB到超过100 MB不等。

将所有zip和rar文件解压后,我得到了总计一百万个文件。

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

我有几个问题:

  1. 如果我使用TPL,我会获得性能上的好处吗?这主要是一个I/O过程,据我所知,当你大量使用I/O时,TPL并没有太多好处。

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

  3. TPL数据流库在这种类型的进程中是否有用?似乎TPL数据流最适合在某种消息系统中使用...

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


5
是的,一百万个文件本质上是输入输出瓶颈。简单地通过增加CPU周期并不会很有效,而且我认为谷歌硬件也无法解决这个问题。请先对少量文件进行全面测试,然后再将其应用于百万级别的文件,放松心情,在海滩上休息一天吧。 - Hans Passant
L.B,我也是这么想的。@Hans 我希望能在不到12小时内索引这些文件的数量。虽然我没有谷歌的硬件,但我并没有卡在一台机器上。 - Martijn
1
只是一个随意的想法:如果您真的受到I/O瓶颈的限制,您可以购买几个小型廉价硬盘并将它们RAID成一个分区-这应该可以轻松地将您的I/O速率提高数倍。 - Superbest
3
当然可以,但这并不是我开始研究的原因。我想要看看是否有可能在一台普通计算机上运行,同时利用.NET框架提供的最新技术。到目前为止,我已经设置了一个Dataflow生产者/消费者,并且初步结果看起来很有前途。 - Martijn
1
如果您有解决方案,请分享一些信息,非常有趣看到您最终采用的解决方案。 - sll
显示剩余2条评论
2个回答

1
async/await在处理外部资源时非常有用,通常是网络请求、文件系统或数据库操作。这里的有趣问题是你需要同时满足多个要求
  • 尽可能少地消耗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,则仍可以在源代码中找到一些有用的示例)

0
你可以使用Everything Search。该SDK是开源的,有C#示例。 这是我见过的在Windows上索引文件最快的方式。
来自FAQ
1.2 索引我的文件需要多长时间?
“Everything”仅使用文件和文件夹名称,并且通常需要几秒钟来构建其数据库。 安装新的Windows XP SP2(约20,000个文件)需要大约1秒钟来索引。 100万个文件需要大约1分钟。
不过我不确定它是否可以与TPL一起使用。

谢谢回复,但这不是我要找的...我已经知道需要索引的文件,我需要一种方法来提取文本并索引文件内容,而不会过度占用我的计算机资源。 - Martijn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接