我需要处理来自大量文件的数据,其中包含数千个行数据。早期我正在逐行读取整个文件并进行处理。当数字处理所有文件时花费了大量时间然后有人说线程可以用来在更短的时间内执行任务?线程可以使这个过程快速。我使用的是c#语言。
答案 0 :(得分:1)
当然可以,但这取决于所讨论的特定工作。一个非常常见的模式是让一个线程执行文件IO,多个线程处理实际的行。
启动多少个处理线程取决于系统上有多少处理器/核心,以及如何写出处理结果。但是,如果每行的处理时间非常小,那么在使用多个处理线程并且单个处理线程最佳时,您可能不会获得太多的速度提升。
答案 1 :(得分:1)
我建议您批量插入数据库。
您可以拥有一个读取并发队列行的线程。而其他线程正在从并发队列中提取数据。如有必要,或者如果您正在对其进行任何操作,请对其进行处理。然后批量插入数据到数据库。它会为你节省很多时间。
在db中插入一行非常慢。你必须进行批量插入。
答案 2 :(得分:0)
是的,使用线程可以加快速度 当你有时间处理可以在后台运行的任务时会使用线程(比如,当你处理10个文件时,但只需要一个,你可以有一个线程处理它们,这将比处理它们快得多)一切都在你的主线上。)
请注意,可能存在相关的错误,因此在继续并尝试访问所获得的内容之前,应确保所有线程都已完成运行。
查找“C#.NET多线程” 任何线程都可以运行指定的函数,后台worker也是一个很好的类(我更喜欢纯多线程)。
另请注意,这可能会适得其反,并且变慢,但尝试尝试是个好主意。
答案 3 :(得分:0)
线程是让您与I / O重叠处理的一种方式(还有其他方法)。这意味着不是总时间是读取数据的时间和处理数据的时间的总和,而是可以将其减少到(大致)两者中较大者(通常是I / O时间)。
如果您最想重叠I / O时间,可能需要查看重叠的I / O和/或I / O完成端口。
编辑:如果你打算这样做,你通常希望将I / O线程的数量基于你将要读取的单独物理磁盘的数量,以及处理线程的数量。您可以进行处理的处理器数量(但只有尽可能多的处理器才能跟上读取器线程提供的数据)。对于典型的台式机,这通常只意味着两个线程,一个用于读取,一个用于处理数据。
答案 4 :(得分:0)
性能问题的好处是假设你的代码只是在做一些不必要的事情,并试图找到它是什么 - 测量,评论,绘制 - 任何适合你的东西。我并不是说你的代码 很慢,只是一种看待它的方法。
首先在混合中添加多线程,您可能会发现分析代码要困难得多。
更具体的任务:将多个类似操作(如从文件中读取记录或提交到数据库)组合在一起可以节省大量时间(您需要进行原型和测量)。