【发布时间】: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 数据流库和异步编程。
我有几个问题:
如果我使用 TPL,我会获得性能优势吗?它主要是一个 I/O 过程,据我了解,当您大量使用 I/O 时,TPL 不会提供太多好处。
生产者/消费者方法是处理此类文件处理的最佳方法,还是有其他更好的模型?我正在考虑使用阻塞集合创建一个具有多个消费者的生产者。
TPL 数据流库对这种类型的进程有用吗?似乎 TPL 数据流最适合用于某种消息传递系统...
在这种情况下我应该使用异步编程还是坚持同步?
【问题讨论】:
-
是的,一百万个文件基本上是一个 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