【问题标题】:Quicker file reading using multi-threading?使用多线程更快地读取文件?
【发布时间】:2012-02-16 15:30:01
【问题描述】:

我编写了一个脚本来使用单线程和多线程读取 100mb+ 的文本文件。多线程脚本共享同一个 StreamReader,并在 StreamReader.ReadLine() 调用期间锁定它。在对我的两个脚本进行计时后,它们的速度大致相同(似乎 ReadLine() 占用了大部分运行时间)。

接下来我可以把它带到哪里?我正在考虑将源文件拆分为多个文本文件,以便每个线程都可以使用自己的 StreamReader,但这似乎有点麻烦。有没有更好的方法来加快我的流程?

谢谢!

【问题讨论】:

    标签: c# multithreading


    【解决方案1】:

    使用单个硬盘,除了使用单个生产者(读取文件)多消费者(处理)模型之外,您无能为力。硬盘需要移动机械“磁头”以寻找下一个读取位置。执行此操作的多个线程只会反弹头部而不会带来任何加速(更糟糕的是,在某些情况下它可能会更慢)。

    分割输入文件更糟糕,因为现在文件块不再连续,需要进一步寻找。

    所以使用单个线程读取大文件的块,或者将任务放入同步队列(例如ConcurrentQueue)以供多个消费者线程使用,或者使用QueueUserWorkItem 访问内置线程池。

    【讨论】:

    • 啊,有道理。谢谢!
    【解决方案2】:

    接下来你可以把它带到哪里?
    添加多个 HDD,然后每个 HDD 有 1 个线程。在 HDD 之间拆分文件。有点像 RAID。

    编辑: 类似的问题在这里被问过很多次。只需使用 1 个线程读取文件和 1 个线程进行处理。不需要多线程。

    【讨论】:

    • 硬盘?你是说硬盘吗? :S
    • 响应您的编辑,我正在尝试从我的脚本中获得更多性能。读取大文件还需要一段时间,如果我能加快速度,那是我的目标。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 2017-02-15
    • 2012-05-27
    • 2020-01-23
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多